有几种方法可以在C中创建字符串数组。如果所有字符串都具有相同的长度(或至少具有相同的最大长度),则只需声明一个二维数组char并根据需要进行分配:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1];
...
strcpy(strs[0], aString); // where aString is either an array or pointer to char
strcpy(strs[1], "foo");
您还可以添加一个初始化器列表:
char strs[NUMBER_OF_STRINGS][STRING_LENGTH+1] = {"foo", "bar", "bletch", ...};
这假定初始化程序中字符串的大小和数量与您的数组尺寸匹配。在这种情况下,每个字符串文字(其本身是一个以零结尾的char数组)的内容都将复制到分配给str的内存中。这种方法的问题是内部碎片的可能性。如果您有99个字符串(不超过5个字符),但1个字符串的长度为20个字符,则99个字符串将至少有15个未使用的字符;那是浪费空间。
除了使用二维数组char,还可以存储一维数组char:
char *strs[NUMBER_OF_STRINGS];
请注意,在这种情况下,您仅分配了内存来保存指向字符串的指针。字符串本身的内存必须分配到其他位置(作为静态数组或使用malloc()
或calloc()
)。您可以像前面的示例一样使用初始化程序列表:
char *strs[NUMBER_OF_STRINGS] = {"foo", "bar", "bletch", ...};
不必复制字符串常量的内容,而只是存储指向它们的指针。请注意,字符串常量可能不可写。您可以重新分配指针,如下所示:
strs[i] = "bar";
strs[i] = "foo";
但是您可能无法更改字符串的内容。即
strs[i] = "bar";
strcpy(strs[i], "foo");
可能是不允许的。
您可以用来malloc()
为每个字符串动态分配缓冲区并复制到该缓冲区:
strs[i] = malloc(strlen("foo") + 1);
strcpy(strs[i], "foo");
顺便说一句,
char (*a[2])[14];
将a声明为2个元素的数组,该数组指向char的14个元素的数组。
char (*a[2])[14]
是两个指针数组,指向14个字符的数组。