C 和 C 中自动结构体和数组的部分初始化
这种误解源于错误的假设,即自动结构体和数组的部分初始化在 C 中是允许的。与此信念相反,标准明确定义了仅两种情况:完全初始化或不初始化初始化。
部分初始化
标准中未定义术语“部分初始化”。它指的是仅初始化结构体或数组中的成员子集。
完全初始化
当结构体或数组的所有成员都显式初始化时,就会发生完全初始化。例如:
struct somestruct { int a; int b; int c; }; somestruct s = {1, 2, 3};
无初始化
未提供初始化时,行为取决于变量的存储类型:
部分实践中的初始化
尽管不是标准行为,但自动结构和数组成员的部分初始化是大多数编译器都支持,包括 Visual Studio 和 gcc/g 。
C 标准 (C99)
第 6.7.8.21 节初始化
如果提供的初始值设定项少于聚合中元素或成员的数量,则剩余元素为初始化为 0。
C 标准 (C 03)
第 8.5.1 节聚合
如果存在较少的初始化器,未初始化的成员被值初始化。值初始化因对象类型而异。例如,非联合类类型的非静态数据成员是值初始化的,而整数等基本类型是零初始化的。
结论
部分自动结构和数组的初始化是一种非标准行为,如果处理不当,可能会导致未定义的结果。为了确保可移植性和正确性,请始终确保完全初始化或不初始化。
以上是是否允许和定义 C 和 C 中自动结构和数组的部分初始化?的详细内容。更多信息请关注PHP中文网其他相关文章!