当描述符重叠时,C11 数组初始化的行为是什么?
What is the behavior of C11 array initialization when descriptors overlap?
鉴于此
int array[10] = {
[0] = 1, 1, 1, 1, 1, 1, 1, // 7 values
[5] = 9
};
gcc (6.3.1) 不会生成初始化重叠的错误或警告。
什么是定义行为?它应该是一个警告或者数组是按照指示符出现的顺序初始化的?
没有警告。该数组按 指定符出现的顺序 进行初始化,因此后面的指定会覆盖前面的指定。
在您的示例中,您首先为前七个值(索引 0 到 6)分配了 1,然后然后为第六个值(索引 5)分配了 9。
您的数组将包含值(按索引 0 到 9 的顺序)
1, 1, 1, 1, 1, 1, 1, 0, 0, 0
从第一个定义,[0] = 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 9, 1, 0, 0, 0
从第二个开始,[5] = 9
这也符合 C99 和 C11 标准,如其所述
"The initialization shall occur in initializer list order, each initializer provided for a particular subobject overriding any previously listed initializer for the same subobject"
鉴于此
int array[10] = {
[0] = 1, 1, 1, 1, 1, 1, 1, // 7 values
[5] = 9
};
gcc (6.3.1) 不会生成初始化重叠的错误或警告。
什么是定义行为?它应该是一个警告或者数组是按照指示符出现的顺序初始化的?
没有警告。该数组按 指定符出现的顺序 进行初始化,因此后面的指定会覆盖前面的指定。
在您的示例中,您首先为前七个值(索引 0 到 6)分配了 1,然后然后为第六个值(索引 5)分配了 9。
您的数组将包含值(按索引 0 到 9 的顺序)
1, 1, 1, 1, 1, 1, 1, 0, 0, 0
从第一个定义,[0] = 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 9, 1, 0, 0, 0
从第二个开始,[5] = 9
这也符合 C99 和 C11 标准,如其所述
"The initialization shall occur in initializer list order, each initializer provided for a particular subobject overriding any previously listed initializer for the same subobject"