user-0 提问: 结构体初始化列表未指明的字段保证是0吗，还是未定义行为

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("AD sizeof %d\n", sizeof(AD));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("A1 sizeof %d\n", sizeof(A1));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("A2 sizeof %d\n", sizeof(A2));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("A4 sizeof %d\n", sizeof(A4));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("A8 sizeof %d\n", sizeof(A8));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("A16 sizeof %d\n", sizeof(A16));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 //AD sizeof 32 // //A1.a 0 //A1.b 4 //A1.c 17 //A1 sizeof 25 // //A2.a 0 //A2.b 4 //A2.c 18 //A2 sizeof 26 // //A4.a 0 //A4.b 4 //A4.c 20 //A4 sizeof 28 // //A8.a 0 //A8.b 4 //A8.c 24 //A8 sizeof 32 // //A16.a 0 //A16.b 4 //A16.c 24 //A16 sizeof 32 // //

user: user-2
content: 引用 30 楼 ipqtjmqj 的回复:[quote=引用 23 楼 fefe82 的回复:] [quote=引用 17 楼 ipqtjmqj 的回复:] @fefe82  你对标准好像很有研究，说一下你的看法  4楼已经引过标准了，C99 6.7.8 Initialization / 20 ，不重复了。[/quote] 另外我对第9点比较困惑，里面说的unnamed members of structure objects到底是怎么样的 [/quote] unnamed bitfield, padding ...  struct a{   char c;   // 这里可能有 3 byte padding   int i;   char c1:1;   char :7; // unnamed bit-field   // 最后可能还有几个字节 padding };

user: user-0
content: 引用 23 楼 fefe82 的回复:[quote=引用 17 楼 ipqtjmqj 的回复:] @fefe82  你对标准好像很有研究，说一下你的看法  4楼已经引过标准了，C99 6.7.8 Initialization / 20 ，不重复了。[/quote] 我英语不太好，你说个结论吧，标准说的是可以确定还是不确定的

user: user-1
content: 引用 22 楼 akirya 的回复:[quote=引用 21 楼 FFY_1208 的回复:] [quote=引用 11 楼 akirya 的回复:] [quote=引用 9 楼 ipqtjmqj 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] 不要轻信任何约定。 您的意思是标准规范没人遵守？[/quote]  各种编译器都还是朝着完全遵守标准走的。知道是符合标准的代码，各家编译器行为都会一致的。  否则就没有正确的代码了。[/quote] 标准也是人定的，是人就会出错。不轻信，不是不信。[/quote] 1 标准总是对的 2 如果标准错了，请参考第一条[/quote] 在现实世界： 1. 1+1从来就没有真正=2过！ 2. 如果你发现这次好象1+1=2了，请参考第1条。

user: user-0
content: 引用 28 楼 Rewen 的回复:不保证，是未定义的行为。  但是有些编辑器，在debug版本的时候会增加一个做初始化的动作， 在release版本就没有。  所以有些时候我们会碰到debug版本是好的，release版本程序报错的情况。 我现在不管编译器有没有遵守了，我只想问标准是怎么说的

user: user-0
content: 引用 23 楼 fefe82 的回复:[quote=引用 17 楼 ipqtjmqj 的回复:] @fefe82  你对标准好像很有研究，说一下你的看法  4楼已经引过标准了，C99 6.7.8 Initialization / 20 ，不重复了。[/quote] 另外我对第9点比较困惑，里面说的unnamed members of structure objects到底是怎么样的

user: user-0
content: 引用 23 楼 fefe82 的回复:[quote=引用 17 楼 ipqtjmqj 的回复:] @fefe82  你对标准好像很有研究，说一下你的看法  4楼已经引过标准了，C99 6.7.8 Initialization / 20 ，不重复了。[/quote] 我看了c99标准，应该是第21点吧

user: user-2
content: 引用 17 楼 ipqtjmqj 的回复:@fefe82  你对标准好像很有研究，说一下你的看法  4楼已经引过标准了，C99 6.7.8 Initialization / 20 ，不重复了。

user: user-3
content: 引用 21 楼 FFY_1208 的回复:[quote=引用 11 楼 akirya 的回复:] [quote=引用 9 楼 ipqtjmqj 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] 不要轻信任何约定。 您的意思是标准规范没人遵守？[/quote]  各种编译器都还是朝着完全遵守标准走的。知道是符合标准的代码，各家编译器行为都会一致的。  否则就没有正确的代码了。[/quote] 标准也是人定的，是人就会出错。不轻信，不是不信。[/quote] 1 标准总是对的 2 如果标准错了，请参考第一条

user: user-4
content: 引用 11 楼 akirya 的回复:[quote=引用 9 楼 ipqtjmqj 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] 不要轻信任何约定。 您的意思是标准规范没人遵守？[/quote]  各种编译器都还是朝着完全遵守标准走的。知道是符合标准的代码，各家编译器行为都会一致的。  否则就没有正确的代码了。[/quote] 标准也是人定的，是人就会出错。不轻信，不是不信。

user: user-2
content: 引用 17 楼 ipqtjmqj 的回复:@fefe82  你对标准好像很有研究，说一下你的看法  "结构体初始化列表" 指的是啥？ A():a(1),b(2) {}  这个吗？  还是这个： A a{1, 2};

user: user-5
content: c++也不保证，因为C++使用初始化列表或者构造函数来完成初始化工作的。

user: user-3
content: 引用 17 楼 ipqtjmqj 的回复:@fefe82  你对标准好像很有研究，说一下你的看法 这个标准是有明确规定的，不是未定义行为。

user: user-6
content: 不保证，是未定义的行为。  但是有些编辑器，在debug版本的时候会增加一个做初始化的动作， 在release版本就没有。  所以有些时候我们会碰到debug版本是好的，release版本程序报错的情况。

user: user-0
content: @fefe82  你对标准好像很有研究，说一下你的看法

user: user-0
content: 引用 15 楼 user-8 的回复:引用 2 楼 ipqtjmqj 的回复:[quote=引用 1 楼 user-8 的回复:] 不保证如果是c＋＋呢，最好引用一个标准  静下心读：http://en.cppreference.com/w/cpp/language/initializer_list  另参看：《深度探索C++对象模型》[/quote] 我问的是aggregate initializaion http://en.cppreference.com/w/cpp/language/aggregate_initialization 上面的链接中说 If the number of initializer clauses is less than the number of members or initializer list is completely empty, the remaining members are value-initialized.  然后看http://en.cppreference.com/w/cpp/language/value_initialization 上面的链接中说otherwise, the object is zero-initialized.

user: user-0
content: 引用 20 楼 fefe82 的回复:[quote=引用 17 楼 ipqtjmqj 的回复:] @fefe82  你对标准好像很有研究，说一下你的看法  "结构体初始化列表" 指的是啥？ A():a(1),b(2) {}  这个吗？  还是这个： A a{1, 2};[/quote] 都不是，我在主楼链接里有代码。

user: user-7
content: struct test t;         t.a = 0; 这是赋值，不是初始化。

user: user-8
content: 引用 2 楼 ipqtjmqj 的回复:引用 1 楼 user-8 的回复:不保证如果是c＋＋呢，最好引用一个标准  静下心读：http://en.cppreference.com/w/cpp/language/initializer_list  另参看：《深度探索C++对象模型》

user: user-1
content: 在没有使用至少不同的五个编译器和开发环境之前，不要轻易下结论。个人意见。