有没有办法初始化半固定,半动态大小的字符串数组?怎么样?
示例:
char **p[2];
/*Memory allocation here*/
strcpy(p[0][0], "foo");
strcpy(p[0][1], "bar");
strcpy(p[1][0], "baz");
strcpy(p[1][1], "qux");
答案 0 :(得分:3)
是的,有办法。
p[0] = malloc(sizeof(char *) * 2); //Two pointers in p[0]
p[1] = malloc(sizeof(char *) * 2); //Two pointers in p[1]
p[0][0] = malloc(sizeof(char) * 4); //4 bytes in p[0][0]
p[0][1] = malloc(sizeof(char) * 4);
p[1][0] = malloc(sizeof(char) * 4);
p[1][1] = malloc(sizeof(char) * 4);
答案 1 :(得分:2)
使用C99中的复合文字,您可以初始化变量p
,如下所示:
extern char **p[2];
char **p[2] = (char **[2]){
(char *[2]){ "foo", "bar" },
(char *[2]){ "baz", "qux" },
};
extern
行会出现在标题中;其余的将放在定义p
的源文件中。或者,您可以不使用extern
行并将其设为static char **p[2] = …
,这可能更好,因为p
是全局变量的糟糕名称。
(char **[2]){ … }
部分是与p
相同类型的复合文字;在里面,它有两个(char *[2]){ … }
单位,一个2 char *
的数组。
指向的字符串不可修改;如果它们必须是可修改的,你必须更加努力(但可以做到)。
此测试代码演示了它的工作原理:
#include <stdio.h>
int main(void)
{
for (int i = 0; i < 2; i++)
{
for (int j = 0; j < 2; j++)
printf("[%s]", p[i][j]);
putchar('\n');
}
return 0;
}
输出:
[foo][bar]
[baz][qux]
如果你想决定两个字符串数组的指针数组应该在运行时多长时间(所以你可以在某个时候添加{ "abc", "def" }
和{ "pqr", "xyz" }
),那么你需要进入动态内存分配,但你可能不会有一个固定的字符串列表开始。您将从(配置?)文件或类似文件中读取它们。