Designated Initializers in C

CServer Side ProgrammingProgramming

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++.

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

int arr[6] = {[3] = 20, [5] = 40}; or
int arr[6] = {[3]20, [5]40};

This is equivalent to this:

int arr[6] = {0, 0, 0, 20, 0, 40};

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

int arr[6] = {[2 … 4] = 10};

This is equivalent to this:

int arr[6] = {0, 0, 10, 10, 10, 0};

if the size of the array is not defined, then it can get the size from the maximum index position. Let us see the code to get better idea.

Example Code

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

Output

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

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. To get the clear idea, please check the code below.

Example Code

#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\n", str1.x, str1.y, str1.z);
   printf ("z = %c\n", str2.z);
}

Output

x = 78, y = 2.324000, z = f
z = r
raja
Published on 28-May-2019 12:33:04
Advertisements