【问题标题】:Using char **, initializing char ** as array of strings in C使用 char **,将 char ** 初始化为 C 中的字符串数组
【发布时间】:2014-10-01 14:19:43
【问题描述】:
char *c[] = { "str1", "str2", "str3", "str4" }; 
char **c = { "str1", "str2", "str3", "str4" }; 

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

【问题讨论】:

  • 它们是两个不同的东西,一个 char* 指针数组和一个指向 char* 指针的 char* 指针——不是一回事
  • 将字符串文字分配给char * 时,请帮自己一个忙,并指定存储类:const char *...const 位是此处的关键
  • 请注意,将一个普通的非常量指针指向字符串文字是没有任何意义的——它应该是一个指向 const 的指针。

标签: c string pointers char initialization


【解决方案1】:

第二行不是数组所以不能使用数组初始化语法

【讨论】:

  • 这是未定义的行为吗?
  • @0d0a:如果它甚至没有编译,它就不可能是未定义的行为!
  • @0d0a:好的——我的错——我猜它编译为 C 但不是 C++。
  • @PaulR 是的,问题被标记为 C,因此我可以重复这个问题:这个 UB(在 C 中)也是如此吗?
  • @0d0a 无法编译。使用真正的 C 编译器代替在线的东西,然后将其编译为 C。gcc -std=c11 -pedantic-errors。指向指针的指针不能用数组初始化,也不能用指向它们数组衰减到的第一个元素的指针来初始化。
【解决方案2】:

第一行是初始化char*数组的标准语法。

第二行根本无效,类型错误。

在 coliru 上观看直播:http://coliru.stacked-crooked.com/a/53464db7e2f31cfa

你可以用复合文字来保存它(C99):

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

请注意,如果在函数中定义了非常量复合文字,则会自动存储。

如果您希望它是一个常量字面量(因此在静态存储中),例如字符串(令人困惑的类型为 char[]),请这样做:

char **c = (char**)&*(const char* const []){ "str1", "str2", "str3", "str4" };

【讨论】:

  • 类型错误,不是语法错误,好的。不过,请打开我的 coliru-link。
  • 为此使用复合文字可能不是一个好主意,因为一开始就有一个指向指针的指针甚至没有任何意义。
  • @Lundin:取决于地点、内容和原因。虽然如果你直接分配给一个变量,可能。现在不能这么说,因为绝对没有上下文为什么 OP 问他的问题。
  • +1,但有一点你错了,复合文字的存储类取决于它的上下文。在文件范围内,它具有静态存储持续时间,这是为指针分配非平凡默认值的有效方法。
  • @JensGustedt:已修复。这是我会使用它的少数几个地方之一。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-16
  • 1970-01-01
  • 2013-09-12
  • 2012-07-27
  • 1970-01-01
相关资源
最近更新 更多