c-designated-initializers
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:
.fieldname = valuesyntax- Can be in any order
- Unspecified fields zero-initialized
- Much clearer than positional args
Array initialization:
[index] = valuesyntax- 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 = valuefor 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
