# C designated initializers **C designated initializers** (C99) let you initialize struct/array members by name or index instead of in declaration order. Write `struct Foo x = {.field = value}` or `int arr[] = {[5] = 10}` to set specific fields without touching others. Use designated initializers for clarity, to skip members, or to initialize non-contiguous elements. ## Example ```c // compile: gcc -std=c99 -o designated designated.c // run: ./designated // description: designated initializers for structs and arrays #include struct Config { int timeout; char *name; int debug; int retries; }; int main() { // Traditional: must specify all fields or leave zeros struct Config c1 = {5, "app", 0, 3}; // Designated: explicit field names, clearer struct Config c2 = { .name = "myapp", .timeout = 10, .retries = 5 // debug left as 0 }; printf("Config 2: %s, timeout=%d, retries=%d\n", c2.name, c2.timeout, c2.retries); // Array designated initializers int arr[10] = { [0] = 1, [5] = 50, [9] = 99 }; printf("Array: [0]=%d, [5]=%d, [9]=%d\n", arr[0], arr[5], arr[9]); return 0; } ``` ## Common patterns **Struct initialization**: - `.fieldname = value` syntax - Can be in any order - Unspecified fields zero-initialized - Much clearer than positional args **Array initialization**: - `[index] = value` syntax - Large sparse arrays without listing all zeros - Mixed with positional: `{1, 2, [5]=6}` **Benefits**: - Self-documenting (clear which field each value sets) - Adding fields doesn't break initialization - Defaults to zero for unspecified fields - Skip fields without listing zeros **C99 vs C11/C17**: - C99: original syntax - C11: adds anonymous struct/union support - Modern compilers support fully **Nested structs**: - `.outer.inner = value` for nested initialization - Can mix designated and positional **Gotchas**: - Order of fields in {} doesn't matter - But only one assignment per field allowed - Can't use with older C standards **Alternative syntax** (C11+): - Designated initializers now standard - Some compilers allow before C99 as extension