如何读取此C数组声明/初始化?

char *names[] = { [3] = "foo", [1] = "bar", [0] = "man"}; int i; for (i=0; i<sizeof(names)/sizeof(char); i++) { puts(names[i]); } 

上述声明中括号的function是什么? 此外,为什么生成的循环迭代3次而不是4次并产生此输出:

酒吧

括号中的数字是初始值设定项的索引。 这是C99function。

鉴于您的示例代码确实使用了这个缺陷,您接收输出的原因是“foo”存储在names[3] ,而NULL存储在names[2] 。 当程序尝试puts(names[2])puts(NULL)同时,程序崩溃。

否则,您的循环将迭代到16或32次迭代 – 您将除以sizeof(char)数组元素大小,并且您的意思是使用sizeof(char *)

最好使用这个宏:

 #define DIMENSION_OF (a) (sizeof(a)/sizeof(a[0])) 

我建议不要使用任何特定于C99的function,例如这些“指定的初始化程序”。

有一个原因是你在这个问题上得到的大多数答案都被混淆为什么你的循环只输出两个字符串而不是四个字符串。 原因是C99未被其他程序员广泛认可。

大多数程序员不熟悉C99更独特的function有几个原因。 一个经常被引用的原因是C99与C ++比ANSI C更不兼容,并且使得将来转换为C ++的可能性更加困难。 我个人对C99的抱怨也对ANSI C进行了扩展,这些扩展是多余的。 多余添加的示例是您提供的C99示例。 不要使用“指定的内容”。 请参阅美国国家标准协会C标准。 请勿参阅国际标准组织C99文件。

C99中“很好”的大多数function都已作为所有主要编译器的扩展。 在for-init-statement中声明变量是一个广泛支持的非ANSI-C标准function的示例。 complex内置类型是不受广泛支持的非ANSI-C标准function的示例。

以下定义显示了如何使用指定的初始值设定项来跳过您不希望显式初始化的数组元素:

 static int number[3] = { [0] = 5, [2] = 7 }; 

数组编号包含以下值:number [0]为5; number [1]隐式初始化为0; 数字[2]是7。

下面的Heath描述了你的for循环的效果,所以我不再重复了。

它将名称声明为char的指针数组(其大小由编译器确定),初始化也确定数组的大小; 初始化“明确”决定特定指针的索引; 例如,man在索引0处,foo在索引3处…最终大小由较大的索引给出,并且未明确给出索引的所有值都设置为null。

它应该是sizeof(char *) ,如前所述。 循环打印内容; 如果数组中的元素数为3,则索引必须从0到2,(2 <3但3 <3为假),因为C中的索引基数为0。