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.
// compile: gcc -std=c99 -o designated designated.c // run: ./designated // description: designated initializers for structs and arrays #include <stdio.h> 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; }
Struct initialization:
.fieldname = value syntaxArray initialization:
[index] = value syntax{1, 2, [5]=6}Benefits:
C99 vs C11/C17:
Nested structs:
.outer.inner = value for nested initializationGotchas:
Alternative syntax (C11+):