char *c[] = { "str1", "str2", "str3", "str4" };
char **c = { "str1", "str2", "str3", "str4" };
第一行是有效的,第二行不是。为什么?
char *c[] = { "str1", "str2", "str3", "str4" };
char **c = { "str1", "str2", "str3", "str4" };
gcc -std=c11 -pedantic-errors
。指向指针的指针不能用数组初始化,也不能用指向数组衰减为的第一个元素的指针进行初始化。 - Lundin第一行是初始化 char*
数组的标准语法。
第二行是无效的,类型错误。
可以使用复合字面量(C99)保存它并在coliru上查看:http://coliru.stacked-crooked.com/a/53464db7e2f31cfa
char **c = (char*[]){ "str1", "str2", "str3", "str4" };
请注意,如果在函数中定义非常量复合字面量,则其存储在自动存储区中。
如果您希望它成为常量字面量(因此存储在静态存储区中),就像字符串一样(令人困惑的是,它们具有类型char[]
),请按以下方式操作:
char **c = (char**)&*(const char* const []){ "str1", "str2", "str3", "str4" };
char *
时,请为自己着想,并指定存储类:const char *
...这里的const
非常关键。 - Elias Van Ootegem