如何在C中动态分配字符串数组?

时间:2015-01-11 01:59:20

标签: c arrays dynamic

我是一个菜鸟,所以不要难过。

而不是像这样的东西;

char string[NUM OF STRINGS][NUM OF LETTERS];

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

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。

5 个答案:

答案 0 :(得分:3)

您还可以对每个单词使用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字符串的长度。

答案 1 :(得分: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个字节。所以如果你有很多短字符串,第一种方法对你来说会更好。

答案 2 :(得分:1)

如果您想要连续的内存分配:

char **string = malloc(nlines * sizeof(char *));
string[0] = malloc(nlines * nletters);
for(i = 1; i < nlines; i++)
    string[i] = string[0] + i * nletters;  

有关更详细的说明:请阅读FAQ list · Question 6.16

答案 3 :(得分:0)

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

答案 4 :(得分:-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);