Reputation: 17831
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?
Upvotes: 41
Views: 22522
Reputation: 862
In addition to the excellent answers above, I also found out that (at least with GCC) you can "partly initialize" a struct without explicitly assigning any member by using {}
:
#include <stdio.h>
struct a {
int x;
int y;
};
int main() {
struct a a = {};
printf ("{.x=%d, .y=%d}\n", a.x, a.y);
return 0;
}
This prints out: {.x=0, .y=0}
.
Upvotes: 1
Reputation: 421978
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.
Upvotes: 54
Reputation: 13581
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. ]
Upvotes: 41