Site Tools


c-designated-initializers

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:

  • .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
c-designated-initializers.md · Last modified: by 127.0.0.1