使用char **,在C中将char **初始化为字符串数组

3
char *c[] = { "str1", "str2", "str3", "str4" }; 
char **c = { "str1", "str2", "str3", "str4" }; 

第一行是有效的,第二行不是。为什么?

它们是两个不同的东西,一个是char指针数组,另一个是char指向char*指针的指针--不是同一件事。 - AndersK
1
当将字符串字面量分配给char *时,请为自己着想,并指定存储类:const char *...这里的const非常关键。 - Elias Van Ootegem
请注意,将一个普通的非const指针指向字符串字面值是毫无意义的 - 应该使用指向const的指针。 - Lundin
2个回答

5
第二行不是数组,因此您不能使用数组初始化语法。

如果代码甚至无法编译,那就不可能是未定义行为! - Paul R
@0d0a:好的,我的错,我猜它可以编译成C,但不能编译成C ++。 - Paul R
@PaulR 是的,问题标记为C语言,因此我可以重复一下问题:这是C语言中的未定义行为吗? - 4pie0
1
它无法编译。使用真正的C编译器而不是在线工具,然后将其作为C编译。gcc -std=c11 -pedantic-errors。指向指针的指针不能用数组初始化,也不能用指向数组衰减为的第一个元素的指针进行初始化。 - Lundin
@Lundin 这个在线工具使用了你在建议中提到的相同的gcc编译器,但是由于-pedantic-errors选项的存在,它变得无法编译,这是事实。 - 4pie0
显示剩余2条评论

3

第一行是初始化 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" };

类型错误,不是语法错误,没问题。还是打开我的 coliru 链接。 - Deduplicator
使用复合字面量可能不是一个好主意,因为在第一次使用指向指针的指针时甚至没有任何意义。 - Lundin
@Lundin:这取决于何时、何地以及为什么。不过如果你直接将其分配给一个变量,那很可能可以。现在无法确定,因为完全不清楚OP提出问题的背景。 - Deduplicator
+1,但你在一个点上是错误的,复合字面量的存储类别取决于其上下文。在文件作用域中,它具有静态存储期,这是将非平凡默认值分配给指针的有效方法。 - Jens Gustedt
@JensGustedt:已修复。这是我很少使用的地方之一。 - Deduplicator

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接