c - C中初始化char指针数组

标签 c arrays pointers

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

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 Initialization ,特别是¶19:

The initialization shall occur in initializer list order, each initializer provided for a particular subobject overriding any previously listed initializer for the same subobject;151) all subobjects that are not initialized explicitly shall be initialized implicitly the same as objects that have static storage duration.

151) Any initializer for the subobject which is overridden and so not used to initialize that subobject might not be evaluated at all.

评论里有反驳:

What if I want other elements to set to same default value?

不幸的是,您必须选择 NULL(在本例中;一般情况下为零)作为默认值。在标准 C 中您没有任何其他选择(不像复杂的现代语言,例如,哦,我不知道 — 让我们想想 Fortran 66)。在标准 C 中,除了多次编写初始化程序外,没有其他方法可以重复初始化程序。

GCC 有一个扩展允许你这样做(在 GCC 手册中标题为 Designated Initializers 的部分记录了标准行为和非标准行为)。使用 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, ],其中 float 不是我们想要的。

关于c - C中初始化char指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47859129/

相关文章:

c - 在不取消引用的情况下将索引与指针一起使用

c - 如何正确地将指针传递给指针数组?

c - 函数中 malloc 和 sscanf 导致的 seg 错误

c - 动态数组和函数化 malloc

c - typedef'ng 指针和 const

c - 在递归函数中打印函数参数

php - PHP 中检查 in_array 的替代方案

javascript - JS 使用分隔符从一列数组创建两列数组

c - 为什么这种移位有效? (用于将数字打印为二进制)

c# - 创建一个由 x 到 y 范围内的值填充的数组