Неинициализированные члены структуры всегда равны нулю?
Рассмотрим структуру C:
struct T {
int x;
int y;
};
Если это частично инициализировано, как в
struct T t = {42};
t.y гарантированно будет 0 или это решение реализации компилятора?
Ответы
Ответ 1
позиция 8.5.1.7 стандартного черновика:
-7- Если в списке меньше инициализаторов, чем в агрегат, то каждый член не явно инициализируется default-initialized (dcl.init). [Пример:
struct S { int a; char* b; int c; };
S ss = { 1, "asdf" };
инициализирует ss.a с 1, ss.b с "asdf" и ss.c со значением выражение формы int(), т.е. 0.]
Ответ 2
Он гарантированно равен 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.
Ответ 3
Нет. он гарантированно равен 0.