例如,如果somestruct有三个整数成员,我一直认为在C(或C++)函数中这样做是可以的:

somestruct s = {123,};

第一个成员将被初始化为123,后两个成员将被初始化为0.我经常对自动数组做同样的事情,编写int arr[100] = {0,};,这样数组中的所有整数都初始化为零.


如果不初始化 struct 变量,效果取决于


请问C和C++标准对部分自动 struct 和自动数组初始化有什么规定?我在Visual Studio中编写上述代码没有任何问题,但我希望与GCC/g++兼容,也许还希望与其他编译器兼容.谢谢

推荐答案

相关的gcc文档并没有提到Partial Initialization,只是提到(Complete)InitializationNo Initialization.

What is partial Initialization?

这些标准没有定义对象的部分初始化,或者存在完全初始化,或者没有初始化.部分初始化是一个非标准术语,通常指的是提供一些初始值设定项但不是全部的情况,即:初始值设定项少于数组的大小或被初始化的 struct 元素的数量.

示例:

int array[10] = {1,2};                    //Case 1:Partial Initialization

What is (Complete)Initialization or No Initialization?

初始化意味着在创建变量的同时为其提供一些初始值.ie:在同一个代码声明中.

示例:

int array[10] = {0,1,2,3,4,5,6,7,8,9};    //Case 2:Complete Initialization
int array[10];                            //Case 3:No Initialization

引用的段落描述了Case 3人的行为.

标准很好地定义了有关部分初始化(Case 1)的规则,这些规则不依赖于正在初始化的变量的存储类型.
AFAIK,所有主流编译器都有Case 1%遵守这些规则.


Can someone please tell me what the C and C++ standards say regarding partial automatic structure and automatic array initialization?

C和C++标准保证即使整数数组位于自动存储器上,并且如果在大括号包围的列表中有较少的初始化式,则未初始化的元素must被初始化为0.

C99 Standard 6.7.8.21

如果大括号内的列表中的初始值设定项少于聚合的元素或成员,或者用于初始化已知大小数组的字符串文本中的字符少于数组中的元素,则聚合的其余部分应隐式初始化,与具有静态存储持续时间的对象相同.


在C++中,规则的声明略有不同.

C++03 Standard 8.5.1 Aggregates
Para 7:

If there are fewer initializers in the list than there are members in the aggregate, then each member not explicitly initialized shall be value-initialized (8.5). [示例:

 struct S { int a; char* b; int c; };
 S ss = { 1, "asdf" };

1初始化ss.a,用"asdf"初始化ss.b,用int()形式的表达式的值初始化ss.c,即0.]

While Value Initialization is defined in,
C++03 8.5 Initializers
Para 5:

对于value-initialize个T类型的对象意味着:

C++相关问答推荐

由于未签名int导致的运行时错误"

如何将一个integer与一个数组进行比较?

GCC不警告隐式指针到整数转换'

GCC:try 使用—WError或—pedantic using pragmas

C语言中字符数组声明中的标准

为什么内核使用扩展到前后相同的宏定义?

为什么sscanf不能正确地从这个字符串格式中提取所有数字?

如何在ASM中访问C struct 成员

实现简单字典时C语言中的段错误

如何在C语言中正确打印图形

每次除以或乘以整数都会得到0.0000

C I/O:在Windows控制台上处理键盘输入

编译器如何处理具有更复杂值的枚举?

Tic-tac-toe:从文件加载存储

为什么会导致分段故障?(C语言中的一个程序,统计文件中某个单词的出现次数)

如何编写postgresql支持函数

未为同一文件中的函数执行DirectFunctionCall

struct 中的qsort,但排序后的 struct 很乱

当 n 是我们从用户那里获得的整数时,创建 n 个 struct 参数

为什么实现文件中的自由函数默认没有内部链接?