Consider a C struct:
struct T {
int x;
int y;
};
When this is partially initialized as in
struct T t = {42};
is t.y guaranteed to be 0 or is this an implementation decision of the compiler?
Consider a C struct:
struct T {
int x;
int y;
};
When this is partially initialized as in
struct T t = {42};
is t.y guaranteed to be 0 or is this an implementation decision of the compiler?
It's guaranteed to be 0 if it's partially initialized, just like array initializers. If it's uninitialized, it'll be unknown.
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.
Similarly:
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.
item 8.5.1.7 of standard draft:
-7- If there are fewer initializers in the list than there are members in the aggregate, then each member not explicitly initialized shall be default-initialized (dcl.init). [Example:
struct S { int a; char* b; int c; }; S ss = { 1, "asdf" };
initializes ss.a with 1, ss.b with "asdf", and ss.c with the value of an expression of the form int(), that is, 0. ]