这可能会做你想要的,但它并不完全符合你的要求。
#include <stdio.h>
char *strs[] = {
"foo",
"bar",
"bazy"
};
int main() {
printf("%d - %s\n", strlen(strs[0]), strs[0]);
printf("%d - %s\n", strlen(strs[1]), strs[1]);
printf("%d - %s\n", strlen(strs[2]), strs[2]);
return 0;
}
输出:
3 - foo
3 - bar
4 - bazy
请注意,您只有几种存储数组的可能性。您可以执行此解决方案所做的事情(创建一个指向数组的指针数组),在一个大数组中创建一个“压缩”数组列表,或者创建一个过大的二维数组。
“压缩”数组将采用以下格式:
char strs[] = "foo\0bar\0bazy"; // array is {f,o,o,\0,b,a,r,\0,b,a,z,y,\0}
这种格式的问题是访问第一个元素之后的任何内容都有些棘手,并且通常涉及在数组中进行线性搜索。(或保留一个单独的地址表......就像第一个解决方案一样)
二维数组要求您指定所有大小,如下所示:
char strs[3][5] = {
"foo",
"baz",
"baxy"
};
int main() {
printf("%d - %s\n", strlen(strs[0]), strs[0]);
printf("%d - %s\n", strlen(strs[1]), strs[1]);
printf("%d - %s\n", strlen(strs[2]), strs[2]);
return 0;
}
这可能在内存中是这样排列的:
{f,o,o,\0,*,b,a,z,\0,*,b,a,x,y,\0} (the *'s could be anything, most dependent on your compiler)
由于编译器知道每个字符串恰好占用 5 个字节,因此它可以轻松计算出后面元素的位置。