C语言 初始化局部数组变量
问题描述
以下数组的第一个元素是否保证被设置为1
而其他所有元素是否被设置为0
还是这是由编译器定义的行为?
#include <stdint.h>
int main () {
uint16_t arr[10] = {1};
}
解决方案
从C标准(6.7.9 初始化)中:
初始化必须按照初始化列表顺序进行,每一个为特定子对象提供的初始化值将覆盖之前为同一子对象列出的任何初始化值;) 所有未显式初始化的子对象将按照具有静态存储期的对象的方式进行隐式初始化。
并且
如果具有自动存储期的对象未显式初始化,则其值是不确定的。如果具有静态或线程存储期的对象未显式初始化,则:
- 如果具有指针类型,则初始化为空指针;
- 如果具有算术类型,则初始化为(正的或无符号的)零;
- 如果是聚合体,则根据这些规则递归地初始化每个成员,并且任何填充都初始化为零位;
- 如果是联合体,则根据这些规则递归地初始化第一个命名成员,并且任何填充都初始化为零位;
因此,由于您的数组的元素类型是算术类型,除了第一个具有显式初始化值的元素之外,数组的所有元素将被初始化为零。
请注意,根据C标准,没有参数的main函数应该声明为
int main( void )