int a[6] = { [4] 29, [2] = 15 };
The previous specification is
equivalent to the following.
int a[6] = { 0, 0, 15, 0, 29, 0 };
The index values must be constant
expressions, even if the array being initialized is automatic. To initialize
a range of elements to the same value, write ‘[
first... last]=value’.
Use the following example.
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
Another syntax which has the same meaning is ‘.fieldname=’ as in the following statement.
struct point p = { .y = yvalue, .x = xvalue };
You can also use an element
label (with either the colon syntax or the period-equal syntax) when initializing
a union, to specify which element of the union should be used. For example,
the following will convert 4 to a double to store it in the union using
the second element.
union foo { int i; double d; };
union foo f = { d: 4 };
By contrast, casting 4 to type
union foo
would store it into the union as the integer ‘i’,
since it is an integer. (See Cast
to a union type.)
You can combine this technique of naming elements with ordinary C initialization of successive elements. Each initializer element that does not have a label applies to the next consecutive element of the array or structure. For example, int a[6] = { [1] = v1, v2, [4] = v4 }; is equivalent to: int a[6] = { 0, v1, v2, 0, v4, 0 };.
Labeling the elements of an array initializer is especially useful when the indices are characters or belong to an enum type, as in the following example.
int whitespace[256]
= { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
['\f'] = 1, ['\n'] = 1, ['\r'] = 1 };