Q:

Unexpected output on initializing array by using both "Element-by-Element" & "Designated" techniques together

C99 provides a feature to initialize arrays by using both element-by-element & designated 
method together as:
int a[] = {2,1,[3] = 5,[5] = 9,6,[8] = 4};

On running the code:
#include <stdio.h>

int main()
{
   int a[] = {2,1,[3] = 5,[0] = 9,4,[6] = 25};
   for(int i = 0; i < sizeof(a)/sizeof(a[0]); i++)
          printf("%d    ",a[i]);

   return 0;
 }

(Note that Element 0 is initialized to 2 and then again initialised by designator [0]
to 9)
I was expecting that element 0(which is 2) will be replaced by 9(as designator [0] = 9)
and hence o/p will become
   9    1   0   5   4   0   25

Unfortunately I was wrong as o/p came;
   9    4   0   5   0   0   25

Any explanation for unexpected o/p? 

A:

Using designated initializers combined with element initializers implies positions based on the designated initializers.
So if you were to do:
int a[] = {2, 1, [3] = 5, 6};

The result ought to be:
2 1 0 5 6

Not:
2 1 0 6

Note that 6 occupies position 3 in the initializer, but its resulting position is implied by the preceding designated initializer (which uses position 3). The position following the one used by the designated initializer is 4, so that is where the 6 is placed.

A:

The process of initializing an array with an initializer is basically:

set the index counter to 0, and initialize the entire array to 0s
go through the initializer elements from left to right
if the initializer element has a designated index, set the index counter to the designated index
store the initializer element value at the index given by the index counter
increment the index counter
go back to step 3 if there are any more initializer elements.

