Table of Contents

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

// 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;
}

Common patterns

Struct initialization:

Array initialization:

Benefits:

C99 vs C11/C17:

Nested structs:

Gotchas:

Alternative syntax (C11+):