代码之家  ›  专栏  ›  技术社区  ›  VoidPointer

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

c c++
  •  20
  • VoidPointer  · 技术社区  · 15 年前

    考虑C结构:

    struct T {
        int x;
        int y;
    };
    

    当这部分初始化为

    struct T t = {42};
    

    T.Y 保证是0还是编译器的实现决定?

    3 回复  |  直到 15 年前
        1
  •  27
  •   bayda    15 年前

    标准草案第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”和ss.c,值为 形式int()的表达式,即, 0。]

        2
  •  26
  •   Mehrdad Afshari    15 年前

    如果它被部分初始化,就保证是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,...}
    

    Sample:

    // 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.
    
        3
  •  3
  •   nothrow    15 年前

    不,保证是0。