tags:

views:

822

answers:

3

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?

+2  A: 

No. it is guaranteed to be 0.

Yossarian
+1 correct answer.
Mehrdad Afshari
+16  A: 

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.
Mehrdad Afshari
Great answer with the compiler example output. I it's really hard to decide whether to accept this one or bb's answer which quotes the relevant part of the spec. I wish I could accept both.
VoidPointer
Note that if the variable is global, it is guaranteed to be initialized to zero on Unix even without initializer. It is a Unix guarantee that unfortunately is not found on Windows.
Juliano
(OT) that GCC's assembly language is really ugly.
Yossarian
Mehrdad Afshari
+15  A: 

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. ]

bb