C语言 初始化局部数组变量

C语言 初始化局部数组变量

问题描述

以下数组的第一个元素是否保证被设置为1而其他所有元素是否被设置为0

还是这是由编译器定义的行为?

#include <stdint.h>

int main () {
    uint16_t arr[10] = {1};
}

解决方案

从C标准(6.7.9 初始化)中:

初始化必须按照初始化列表顺序进行,每一个为特定子对象提供的初始化值将覆盖之前为同一子对象列出的任何初始化值;) 所有未显式初始化的子对象将按照具有静态存储期的对象的方式进行隐式初始化。

并且

如果具有自动存储期的对象未显式初始化,则其值是不确定的。如果具有静态或线程存储期的对象未显式初始化,则:

- 如果具有指针类型,则初始化为空指针;

- 如果具有算术类型,则初始化为(正的或无符号的)零;

- 如果是聚合体,则根据这些规则递归地初始化每个成员,并且任何填充都初始化为零位;

- 如果是联合体,则根据这些规则递归地初始化第一个命名成员,并且任何填充都初始化为零位;

因此,由于您的数组的元素类型是算术类型,除了第一个具有显式初始化值的元素之外,数组的所有元素将被初始化为零。

请注意,根据C标准,没有参数的main函数应该声明为

int main( void )

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程