C++ 未初始化的结构成员是否总是设置为零?

C++ 未初始化的结构成员是否总是设置为零?,c++,c,C++,C,考虑一个C结构: struct T { int x; int y; }; 当它被部分初始化时,如中所示 struct T t = {42}; t.y是保证为0还是这是编译器的实现决定?否。它保证为0。如果它是部分初始化的,就像数组初始化器一样,它保证为0。如果它未初始化,它将是未知的 struct T t; // t.x, t.y will NOT be initialized to 0 (not guaranteed to) struct T t = {42}; // t

考虑一个C结构:

struct T {
    int x;
    int y;
};
当它被部分初始化时,如中所示

struct T t = {42};

t.y是保证为0还是这是编译器的实现决定?

否。它保证为0。

如果它是部分初始化的,就像数组初始化器一样,它保证为0。如果它未初始化,它将是未知的

struct T t; // t.x, t.y will NOT be initialized to 0 (not guaranteed to)

struct T t = {42}; // t.y will be initialized to 0.
同样地:

int x[10]; // Won't be initialized.

int x[10] = {1}; // initialized to {1,0,0,...}
样本:

// a.c
struct T { int x, y };
extern void f(void*);
void partialInitialization() {
  struct T t = {42};
  f(&t);
}
void noInitialization() {
  struct T t;
  f(&t);
}

// Compile with: gcc -O2 -S a.c

// a.s:

; ...
partialInitialzation:
; ...
; movl $0, -4(%ebp)     ;;;; initializes t.y to 0.
; movl $42, -8(%ebp)
; ...
noInitialization:
; ... ; Nothing related to initialization. It just allocates memory on stack.

标准草案第8.5.1.7项:

-7-如果列表中的初始值设定人少于列表中的成员 聚合,则每个成员不 显式初始化应为 默认已初始化(dcl.init)。 [示例:

struct S { int a; char* b; int c; };
S ss = { 1, "asdf" };
用1初始化ss.a,用1初始化ss.b “asdf”和值为 形式为int()的表达式,即, 0。]


编译器示例输出的极好答案。我真的很难决定是接受这一个还是bb的答案,其中引用了规范的相关部分。我希望我可以接受这两个部分。请注意,如果变量是全局变量,即使没有初始值设定项,它在Unix上也保证初始化为零。不幸的是,这是在Windows上找不到的Unix保证。(OT)GCC的汇编语言真的很难看。同意。我讨厌AT&T的语法。英特尔语法万岁@朱利安诺:那个信息完全不正确。未显式初始化的全局变量(以及具有静态存储持续时间的所有变量)最初始终为零。这是C语言的基本部分,与操作系统无关。