我正在验证结构成员初始化。编译器是gcc 4.8.5
和代码是这样的:非显式初始化成员在其成员初始化的结构中始终为0?
#include <stdio.h>
typedef struct
{
int m1;
int m2;
} A;
int main(void) {
A a;
A b = {.m1 =1};
A c = {1};
printf("%d, %d\n", a.m1, a.m2);
printf("%d, %d\n", b.m1, b.m2);
printf("%d, %d\n", c.m1, c.m2);
return 0;
}
执行它的结果是:
-1498088800, 32765
1, 0
1, 0
并且该组件的代码是:
0x0000000000400530 <+0>: push %rbp
0x0000000000400531 <+1>: mov %rsp,%rbp
0x0000000000400534 <+4>: sub $0x30,%rsp
0x0000000000400538 <+8>: movq $0x0,-0x20(%rbp)
0x0000000000400540 <+16>: movl $0x1,-0x20(%rbp)
0x0000000000400547 <+23>: movq $0x0,-0x30(%rbp)
0x000000000040054f <+31>: movl $0x1,-0x30(%rbp)
0x0000000000400556 <+38>: mov -0xc(%rbp),%edx
0x0000000000400559 <+41>: mov -0x10(%rbp),%eax
0x000000000040055c <+44>: mov %eax,%esi
0x000000000040055e <+46>: mov $0x400640,%edi
0x0000000000400563 <+51>: mov $0x0,%eax
0x0000000000400568 <+56>: callq 0x400410 <[email protected]>
从汇编代码:
0x0000000000400538 <+8>: movq $0x0,-0x20(%rbp)
0x0000000000400540 <+16>: movl $0x1,-0x20(%rbp)
0x0000000000400547 <+23>: movq $0x0,-0x30(%rbp)
0x000000000040054f <+31>: movl $0x1,-0x30(%rbp)
我可以看到,如果我初始化结构的部分成员,其他成员默认设置为0
。这是否符合C
规范?还是只依赖于编译器?
减一?我根本不明白这一点。 – Bathsheba
http://stackoverflow.com/questions/10828294/c-and-c-partial-initialization-of-automatic-structure/10828333#10828333的可能的复制 –