首页 > 后端开发 > C++ > 是否允许和定义 C 和 C 中自动结构和数组的部分初始化?

是否允许和定义 C 和 C 中自动结构和数组的部分初始化?

Barbara Streisand
发布: 2024-12-11 08:49:10
原创
963 人浏览过

Is Partial Initialization of Automatic Structures and Arrays in C and C   Allowed and Defined?

C 和 C 中自动结构体和数组的部分初始化

这种误解源于错误的假设,即自动结构体和数组的部分初始化在 C 中是允许的。与此信念相反,标准明确定义了仅两种情况:完全初始化或不初始化初始化。

部分初始化

标准中未定义术语“部分初始化”。它指的是仅初始化结构体或数组中的成员子集。

完全初始化

当结构体或数组的所有成员都显式初始化时,就会发生完全初始化。例如:

struct somestruct {
  int a;
  int b;
  int c;
};

somestruct s = {1, 2, 3};
登录后复制

无初始化

未提供初始化时,行为取决于变量的存储类型:

  • 对于自动变量(在栈上),未初始化的成员不保证被初始化。它们的值是不确定的。
  • 对于静态变量(具有全局或文件作用域),未初始化的成员对于整型类型初始化为 0,对于指针成员初始化为 NULL。

部分实践中的初始化

尽管不是标准行为,但自动结构和数组成员的部分初始化是大多数编译器都支持,包括 Visual Studio 和 gcc/g 。

C 标准 (C99)

第 6.7.8.21 节初始化

如果提供的初始值设定项少于聚合中元素或成员的数量,则剩余元素为初始化为 0。

C 标准 (C 03)

第 8.5.1 节聚合

如果存在较少的初始化器,未初始化的成员被值初始化。值初始化因对象类型而异。例如,非联合类类型的非静态数据成员是值初始化的,而整数等基本类型是零初始化的。

结论

部分自动结构和数组的初始化是一种非标准行为,如果处理不当,可能会导致未定义的结果。为了确保可移植性和正确性,请始终确保完全初始化或不初始化。

以上是是否允许和定义 C 和 C 中自动结构和数组的部分初始化?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板