Неинициализированные члены структуры всегда равны нулю? Рассмотрим структуру 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.
Ответ 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.