在C中初始化char指针数组

MeRock027

这样初始化数组中的某些元素是否安全?

const char *str_array[50] = {
    [0] = "str_0",
    [10] = "str_10",
    [24] = "str_24",
    [45] = "str_45",
};

我可以依靠正确初始化的数组的其他元素吗?

乔纳森·莱夫勒

问题中显示的初始化是安全的,并且未使用指定的初始化程序专门初始化的元素(在这种情况下)被初始化为NULL。通常,未初始​​化的元素的初始化与相同类型的静态变量的初始化相同,这与“零”主题有所不同。

C标准(ISO / IEC 9899:2011)的相关部分是§6.7.9初始化,尤其是¶19:

初始化应以初始化程序列表的顺序进行,为特定子对象提供的每个初始化程序都将覆盖先前为同一子对象列出的所有初始化程序。151)所有未明确初始化的子对象应与具有静态存储持续时间的对象隐式初始化。

151)被覆盖的子对象的任何初始化程序,因此不用于初始化该子对象的初始化程序可能根本不会被评估。

评论中有一个驳斥:

如果我希望其他元素设置为相同的默认值怎么办?

不幸的是,您必须选择NULL(在这种情况下;一般情况下为零)作为默认值。您在标准C语言中没有其他选择(不同于复杂的现代语言,例如,哦,我不知道,让我们考虑一下Fortran 66)。标准C中除了重复写入多次外,没有其他方法可以重复初始化它。

GCC具有扩展名,可让您执行此操作(在GCC手册的标题为“指定初始化器”的部分中进行了说明,该文档同时记录了标准行为和非标准行为)。使用GNU扩展,您可以编写:

const char *str_array[50] = {
    [1 ... 49] = "empty string",  // GCC extension
    [0] = "str_0",
    [10] = "str_10",
    [24] = "str_24",
    [45] = "str_45",
};

请注意,可以为一个单元指定两个初始化程序(例如10、24、45,另一个是通过重复的初始化程序);最后一个提到获胜。另请注意...,将1(和45分隔开这是因为这意味着“最大适合规则”的关键[1...45]将被符号化的[1...45],其中浮点数是不是出了什么想要的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章