在 C 中初始化局部数组变量 [duplicate]

Initializing local array variable in C [duplicate]

提问人:unalignedmemoryaccess 提问时间:10/21/2023 最后编辑:Vlad from Moscowunalignedmemoryaccess 更新时间:10/21/2023 访问量:57

问:

是否保证以下数组中的第一个元素将设置为 ,而所有其他元素将设置为 ,或者它是编译器定义的行为?10

#include <stdint.h>

int main () {
    uint16_t arr[10] = {1};
}
数组 C 初始化存储 持续时间

评论

1赞 Simon Lundberg 10/21/2023
请参阅此问题:stackoverflow.com/questions/10828294/...

答:

2赞 Vlad from Moscow 10/21/2023 #1

从 C 标准(6.7.9 初始化)

19 初始化应按初始值设定项列表顺序进行,每个 为特定子对象提供的初始值设定项覆盖任何 先前列出的同一子对象的初始值设定项;154) 全部 未显式初始化的子对象应初始化 隐式相同,与具有静态存储持续时间的对象相同。

10 如果具有自动存储持续时间的对象未初始化 明确地说,它的值是不确定的。如果具有静态的对象 或者线程存储持续时间未显式初始化,则:

— 如果它有指针类型,则初始化为空指针;

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

— 如果它是一个聚合,则每个成员都会被初始化(递归) 根据这些规则,任何填充都初始化为零位;

— 如果是联合,则初始化第一个命名成员 (递归)根据这些规则,并且任何填充都会被初始化 到零位;

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

需要注意的是,按照C标准,不带参数的函数主函数应声明为:

int main( void )