Designated Initializers in C

In C90 standard we have to initialize the arrays in the fixed order, like initialize index at position 0, 1, 2 and so on. From C99 standard, they have introduced designated initializing feature in C. Here we can initialize elements in random order. Initialization can be done using the array index or structure members. This extension is not implemented in GNU C++.

Syntax

// Array designated initialization
type array[size] = {[index] = value, [index] = value, ...};

// Range designated initialization
type array[size] = {[first ... last] = value};

// Structure designated initialization
struct name variable = {.member = value, .member = value, ...};

Example 1: Array Designated Initialization

If we specify some index and put some value, then it will look like this −

#include <stdio.h>

int main() {
    int arr[6] = {[3] = 20, [5] = 40};
    
    printf("Array elements: ");
    for (int i = 0; i < 6; i++) {
        printf("%d ", arr[i]);
    }
    printf("
"); return 0; }
Array elements: 0 0 0 20 0 40 

This is equivalent to writing int arr[6] = {0, 0, 0, 20, 0, 40};

Example 2: Range Designation

We can also put some range of elements using this syntax: [first ... last] = value.

#include <stdio.h>

int main() {
    int arr[6] = {[2 ... 4] = 10};
    
    printf("Array elements: ");
    for (int i = 0; i < 6; i++) {
        printf("%d ", arr[i]);
    }
    printf("
"); return 0; }
Array elements: 0 0 10 10 10 0 

This is equivalent to writing int arr[6] = {0, 0, 10, 10, 10, 0};

Example 3: Array Size from Maximum Index

If the size of the array is not defined, then it can get the size from the maximum index position −

#include <stdio.h>

int main() {
    int Array[] = {10, 20, 30, [3 ... 9] = 100, [10] = 65, 15, [80] = 50, [42] = 400};
    
    printf("First 20 elements: ");
    for (int i = 0; i < 20; i++) {
        printf("%d ", Array[i]);
    }
    printf("\nArray[80] = %d
", Array[80]); printf("Array[42] = %d
", Array[42]); printf("Size of this array: %ld
", sizeof(Array) / sizeof(Array[0])); return 0; }
First 20 elements: 10 20 30 100 100 100 100 100 100 100 65 15 0 0 0 0 0 0 0 0 
Array[80] = 50
Array[42] = 400
Size of this array: 81

Example 4: Structure Designated Initialization

This designated initialization can also be performed for structure or union type objects. For them we can initialize the variables using the name of the member variables with one dot (.) at the beginning in any order −

#include <stdio.h>

struct myStruct {
    int x;
    float y;
    char z;
};

int main() {
    struct myStruct str1 = {.y = 2.324, .z = 'f', .x = 78};
    struct myStruct str2 = {.z = 'r'};
    
    printf("x = %d, y = %f, z = %c
", str1.x, str1.y, str1.z); printf("z = %c
", str2.z); return 0; }
x = 78, y = 2.324000, z = f
z = r

Key Points

  • Designated initializers allow initialization in any order
  • Unspecified elements are automatically set to zero
  • Range designation uses the [first ... last] syntax
  • For structures, use dot notation like .member = value

Conclusion

Designated initializers in C99 provide flexibility for array and structure initialization by allowing specific index or member assignment. This feature improves code readability and enables sparse array initialization efficiently.

Updated on: 2026-03-15T10:42:21+05:30

1K+ Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements