Неинициализированные члены структуры всегда установлены в ноль? - PullRequest
20 голосов
/ 01 апреля 2009

Рассмотрим структуру C:

struct T {
    int x;
    int y;
};

Когда это частично инициализируется как в

struct T t = {42};

равен t.y гарантированно равным 0 или это решение о реализации компилятора?

Ответы [ 3 ]

27 голосов
/ 01 апреля 2009

Гарантируется, что он будет равен 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.
27 голосов
/ 01 апреля 2009

пункт 8.5.1.7 стандартной тяги:

-7- Если в списке меньше инициализаторов, чем членов в агрегировать, то каждый член не явно инициализируется инициализированный по умолчанию (dcl.init). [Пример:

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

инициализирует ss.a с 1, ss.b с "asdf" и ss.c со значением выражение вида int (), то есть 0.]

3 голосов
/ 01 апреля 2009

Нет. оно гарантированно равно 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...