带间隙的静态数组初始化及未指定元素置零的C标准依据查询
带间隙的静态数组初始化及未指定元素置零的C标准依据查询
你说的这种通过指定下标初始化静态数组,没被明确赋值的元素自动置零的行为,在C标准里有明确的规定,我帮你把对应的核心条款整理出来了,不用再到处翻文档啦:
先确认你给出的这段代码的行为完全符合标准:
static int arr[] = { [1] = 1, [10] = 2, [5] = 3 };
这段代码确实会创建一个大小为11的int数组,下标0、2-4、6-9的元素都会被自动初始化为0。
对应的C标准条款(从C99开始引入该规则,C11、C17等后续版本均延续):
- 未指定元素的初始化规则:在*C11标准的6.7.9节(初始化)*的第19条中明确规定:对于静态存储期的聚合类型对象(比如数组),如果初始化列表中没有显式初始化某些元素,那么这些元素会被自动初始化为算术类型的零,或者指针类型的空指针值。你的数组是
static(静态存储期),所以未被指定的元素自然会被置零。 - 数组大小的确定规则:同样在*C11标准的6.7.9节(初始化)*的第22条中规定:当数组声明使用
[]且带有指定初始化器时,数组的大小会被设置为初始化列表中出现的最大下标值加1,所以这里最大下标是10,数组大小就是11。
备注:内容来源于stack exchange,提问作者White Owl
相关产品推荐
相关产品推荐

