The number in parentheses is the indexes of the initializers. This is the function of C99.
Given that your sample code does exploit this flaw, the reason you get the output you make is because "foo" is stored in names[3], and NULLstored in names[2]. Your program crashes on an attempt puts(names[2])that matches the puts(NULL).
16 32 - sizeof(char) , sizeof(char *).
:
- C99 , " ".
, , , , , . , C99 .
, C99 . , C99 ++, ANSI C, ++. C99 ANSI C . C99, . " ". C. C99 .
, " " C99, . for-init- , ANSI-C, . complex , ANSI-C, .