如何在C语言中动态分配一个字符串数组?

3
我是一个新手,请别对我太苛刻。与其像这样;
char string[NUM OF STRINGS][NUM OF LETTERS];

是否可以像动态分配 char 指针的内存一样,使用 malloc 动态分配字符串数组中的元素数量?就像这样:

int lines;
scanf("%d", &lines);
char *string[NUM OF LETTERS]
string = malloc(sizeof(char) * lines);

我尝试过了,但它没有起作用;我一定做错了什么。 我想到的另一个解决方案是:
int lines;
scanf("%d", &lines);
char string[lines][NUM OF LETTERS];

但是我想知道是否可以使用malloc来实现。


这个对你有帮助吗?http://stackoverflow.com/a/25755572/1392132 - 5gon12eder
5个回答

4
您可以像这样为每个单词使用malloc。该方法与使用一个大的内存块相比,可以更好地控制内存使用情况。
char **array;
int    lines;   
int    i;   

while (scanf("%d", &lines) != 1);

array = malloc(lines * sizeof(char *));
if (array != NULL)
{
    for (i = 0 ; i < lines ; ++i)
    {
        int numberOfLetters;

        while (scanf("%d", &numberOfLetters) != 1);
        array[i] = malloc(numberOfLetters);
    }
}    

其中numberOfStringslengthOfStrings[i]是整数,分别表示你要使数组包含的字符串数量和数组中第i个字符串的长度。


值得注意的是,这与char string[NUM OF STRINGS][NUM OF LETTERS];不等价。这个版本不是连续的。相反,OP可能(或者在这种情况下很可能不会)想要进行numberOfStrings*numberOfLetters的单个malloc。 - tux3
为什么不需要进行类型转换?malloc返回void*,但在这种情况下没有进行类型转换。 - Mayank
@Mayank 因为在 [tag:c] 中,你不需要从 void * 进行强制转换。与 [tag:c++] 不同,[tag:c] 中的 void * 可以在没有强制转换的情况下转换为任何指针类型。点击此处了解更多 - Iharob Al Asimi

2
如果您需要连续的内存分配:
char **string = malloc(nlines * sizeof(char *));
string[0] = malloc(nlines * nletters);
for(i = 1; i < nlines; i++)
    string[i] = string[0] + i * nletters;  

更详细的解释请阅读FAQ列表·问题6.16


2

您有两种方法来实现这个。

第一种方法更加复杂,因为它需要为指向字符串的指针数组分配内存,并且还需要为每个字符串分配内存。

您可以为整个数组分配内存:

char (*array)[NUM_OF_LETTERS]; // Pointer to char's array with size NUM_OF_LETTERS
scanf("%d", &lines);
array = malloc(lines * NUM_OF_LETTERS);
. . .
array[0] = "First string\n";
array[1] = "Second string\n";
// And so on;

第二种方法的缺点是为每个字符串分配了NUM_OF_LETTERS字节。因此,如果您有许多短字符串,第一种方法更适合您。

我明白了。非常感谢。 - Dj Doina

0
int lines;
scanf("%d", &lines);
char (*string)[NUM OF LETTERS]
string = malloc(sizeof(*string) * lines);

你应该解释为什么这个代码可以工作,而 *string[NUM OF LETTERS] 不行。 - Iharob Al Asimi
使用指针的数量来表示字符数是很有趣的。 - BLUEPIXY
所以当我使用 char *string[NUM OF LETTERS] 时,NUM OF LETTERS 实际上是指针的数量吗?我感到困惑。@BLUEPIXY - Dj Doina
@Dj Doina 是的,没错。type *var[NUM] 表示 NUM 个指向 type 的指针数组,因为 [] 优先级高于 *。type (*var)[NUM] 表示指向 type 数组中 NUM 个元素的指针,因为 () 优先级高于 *。 - Mark Shevchenko

-1
char **ptop;
int iStud;
int i;
printf("Enter No. of Students: ");
scanf("%d",&iStud);

ptop=(char **) malloc(sizeof(char)*iStud);
flushall();


for(i=0;i<iStud;i++)
{
        ptop[i]=(char *) malloc(sizeof(char)*50);
        gets(ptop[i]);
}


for(i=0;i<iStud;i++)
{
    puts(ptop[i]);
}
free(ptop);

这个 ptop=(char **) malloc(sizeof(char)*iStud); 应该改为 ptop=(char **) malloc(sizeof(char*)*iStud); - alk
不要使用gets()。它已经不再是C语言了。请使用fgets() - alk
在C语言中,不需要对malloc()等函数进行强制类型转换。 - alk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接