Nested initialization of structure variables

How to initialize this nested structure in C?

typedef struct _s0 { int size; double * elems; }StructInner ; typedef struct _s1 { StructInner a, b, c, d, e; long f; char[16] s; }StructOuter; StructOuter myvar = {/* what ? */ }; 
+4
source share
3 answers

To initialize everything to 0 (the desired type)

 StructOuter myvar = {0}; 

To initialize items to a specific value

 StructOuter myvar = {{0, NULL}, {0, NULL}, {0, NULL}, {0, NULL}, {0, NULL}, 42.0, "foo"}; /* that {a, b, c, d, e, f, s} */ /* where each of a, b, c, d, e is {size, elems} */ 

Edit

If you have a C99 compiler, you can also use "designated initializers", as in:

 StructOuter myvar = {.c = {1000, NULL}, .f = 42.0, .s = "foo"}; /* c, f, and s initialized to specific values */ /* a, b, d, and e will be initialized to 0 (of the right kind) */ 
+13
source
 double a[] = { 1.0, 2.0 }; double b[] = { 1.0, 2.0, 3.0 }; StructOuter myvar = { { 2, a }, { 3, b }, { 2, a }, { 3, b }, { 2, a }, 1, "a" }; 

It seems a and b cannot be initialized in place in regular C

+2
source

To highlight structure labels in particular:

 StructInner a = { .size: 1, .elems: { 1.0, 2.0 }, /* optional comma */ }; StructOuter b = { .a = a, /* struct labels start with a dot */ .b = a, a, /* they are optional and you can mix-and-match */ a, .e = { /* nested struct initialization */ .size: 1, .elems: a.elems }, .f = 1.0, .s = "Hello", /* optional comma */ }; 
0
source

All Articles