C11数组初始化指定符重叠的行为及GCC编译相关问题问询
C11中数组初始化指定符重叠的行为解析
首先明确C11(ISO/IEC 9899:2011)标准里的定义:当数组初始化列表中出现重叠的初始化指定符(即同一个数组元素被多个初始化条目赋值)时,这属于定义行为,规则是按初始化条目在列表中的出现顺序依次执行初始化——后面的赋值操作会直接覆盖前面对同一元素的赋值结果。
针对你给出的代码分析
先把你的代码清晰列出来:
int array[10] = { [0] = 1, 1, 1, 1, 1, 1, 1, [5] = 9 };
我们一步步拆解初始化的执行顺序:
[0] = 1:将array[0]赋值为1;- 紧接着的6个
1属于顺序初始化,会从[0]的下一个位置(也就是array[1])开始依次赋值,直到array[6],所以array[1]到array[6]此时都被设为1; - 最后
[5] = 9:将array[5]重新赋值为9,直接覆盖了之前的1。
最终数组的元素状态是:
array[0] = 1,array[1]-array[4] = 1,array[5] = 9,array[6] = 1;- 未被初始化列表覆盖的
array[7]-array[9]会被C标准默认初始化为0(对于int类型,未显式初始化的静态/自动数组元素都会被置为0)。
关于GCC的警告问题
GCC 6.3.1默认不生成重叠初始化的警告,是因为这种写法完全符合C11标准的定义行为,不属于编译错误。不过如果你希望编译器检测这类可能存在混淆的写法,可以开启-Woverride-init编译选项,此时GCC就会针对重叠初始化的情况发出警告,比如编译时执行:
gcc -Woverride-init your_code.c
就会收到类似warning: initialized field overwritten [-Woverride-init]的提示。
小建议
虽然这种重叠初始化是合法的,但可读性很差,后续维护代码时很容易忽略掉覆盖逻辑,实际开发中尽量避免这种写法,优先采用清晰、无歧义的初始化方式。
内容的提问来源于stack exchange,提问作者KeithSmith
相关产品推荐
相关产品推荐

