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

bq8i3lrv  于 2023-08-03  发布在  其他
关注(0)|答案(4)|浏览(135)

考虑一个C结构:

struct T {
    int x;
    int y;
};

字符串
当它被部分初始化时,如

struct T t = {42};


t.y是否保证为0,或者这是编译器的实现决定?

8i9zcol2

8i9zcol21#

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

eyh26e7m

eyh26e7m2#

标准草案8.5.1.7项:
-7-如果列表中的初始化器少于集合中的成员,则每个未显式初始化的成员将被默认初始化(dcl.init)。[示例:

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

字符串
用1初始化ss.a,用“asdf”初始化ss.B,用int()形式的表达式的值初始化ss. c,即0。]

z9zf31ra

z9zf31ra3#

不,它保证为0。

3b6akqbq

3b6akqbq4#

除了上面的优秀答案,我还发现(至少在GCC中)你可以通过使用{}来“部分初始化”一个结构体,而不显式地分配任何成员:

#include <stdio.h>

struct a {
    int x;
    int y;
};

int main() {
    struct a a = {};

    printf ("{.x=%d, .y=%d}\n", a.x, a.y);
    return 0;
}

字符串
这将输出:{.x=0, .y=0}的值。

相关问题