如何在ANSI C中malloc一个字符串数组?

Yuk*_*awa 0 c c++

在C++中,我可以非常轻松地分配一个字符串数组(比如10个字符串):

string* arrayOfString = new string[10];
Run Code Online (Sandbox Code Playgroud)

但我不知道如何在ANSI C中做到这一点.我试过:

char** arrayOfString = (*(char[1000])) malloc (sizeof (*(char[1000])));
Run Code Online (Sandbox Code Playgroud)

但编译器(MinGW 3.4.5)一直说它是"语法错误".怎么做对了?谢谢.

Naw*_*waz 9

如果每个字符串具有在编译时已知的相同大小,例如它是100,那么您可以执行以下操作1:

typedef char cstring[100]; //cstring is a new type which is 
                           //a char array of size 100

cstring *arrstring = malloc (1000 * sizeof (cstring));

int i;
for( i = 0 ; i < 1000 ; ++i)
     strcpy(arrstring[i], "some string of size less than or equal to 100");

for( i = 0 ; i < 1000 ; ++i)
     printf("%s\n", arrstring[i]);
Run Code Online (Sandbox Code Playgroud)

演示:http://ideone.com/oNA30

1.请注意,正如@Eregrith在注释中指出的那样,如果将代码编译为C,则不建议使用强制转换.但是,如果将其编译为C++,则需要编写,(cstring*)malloc (1000 * sizeof (cstring))但在C++中,应避免编写此类代码首先.std::vector<std::string> 正如本文底部所解释的,C++中更好的替代方案.

如果在编译时不知道每个字符串的大小,或者每个字符串的大小不同,那么您可以这样做:

char **arrstring =  malloc(sizeof(char*) * 1000); //1000 strings!
int i;
for(i = 0 ; i < 1000; ++i)
     arrstring[i] = (char*) malloc(sizeof(char) * sizeOfString); 
Run Code Online (Sandbox Code Playgroud)

我假设sizeOfString所有1000个字符串的大小相同.如果它们的大小不同,那么你需要在每次迭代中传递不同的值,如下所示:

for(i = 0 ; i < 1000; ++i)
     arrstring[i] = malloc(sizeof(char) * sizeOfEachString[i]); 
Run Code Online (Sandbox Code Playgroud)

我希望能帮助你,我也希望你能自己做好准备.


顺便说一句,在C++中,你不应该这样做:

string* arrayOfString = new string[10]; //avoid new as much as possible!
Run Code Online (Sandbox Code Playgroud)

相反,你应该这样做:

std::vector<std::string>  strings;
strings.reserve(10);
Run Code Online (Sandbox Code Playgroud)

  • 不建议转换malloc的返回(如[此答案](http://stackoverflow.com/a/605858/1151654)解释)但如果您计划将代码编译为C++,则必须进行necesseray. (2认同)
  • typedef'ing一个数组?真? (2认同)