char *names[] = {
[3] = "foo",
[1] = "bar",
[0] = "man"};
int i;
for (i=0; i<sizeof(names)/sizeof(char); i++)
{
puts(names[i]);
}
上述声明中括号的功能是什么?此外,为什么生成的循环迭代3次而不是4次并产生此输出:
人
巴
答案 0 :(得分:4)
以下定义显示了如何使用指定的初始值设定项来跳过您不希望显式初始化的数组元素:
static int number[3] = { [0] = 5, [2] = 7 };
数组编号包含以下值:number [0]为5; number [1]隐式初始化为0;数字[2]是7。
下面的Heath描述了你的for循环的效果,所以我不再重复了。
答案 1 :(得分:3)
括号中的数字是初始值设定项的索引。这是C99功能。
鉴于您的示例代码确实使用了这种瑕疵,您收到输出的原因是“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的功能,例如这些“指定的初始值设定项”。
有一个原因是你在这个问题上得到的大多数答案都被混淆为什么你的循环只输出两个字符串而不是四个字符串。原因是C99没有得到其他程序员的广泛认可。
大多数程序员不熟悉C99更显着的功能有几个原因。一个经常被引用的原因是C99与C ++比ANSI C更不兼容,并且使得将来转换为C ++的可能性更加困难。我个人对C99的抱怨也对ANSI C进行了扩展,这些扩展是多余的。多余添加的示例是您提供的C99示例。不要使用“指定的内容”。请参阅美国国家标准协会C标准。不要参考国际标准组织C99文件。
所有主要编译器中都提供了C99“很好”的大部分功能。在for-init-statement中声明变量是一个广泛支持的非ANSI-C标准功能的示例。 complex
内置类型是不受广泛支持的非ANSI-C标准功能的示例。
答案 2 :(得分:2)
它将名称声明为char的指针数组(其大小由编译器确定),初始化也确定数组的大小;初始化“明确”决定特定指针的索引;例如man在索引0处,foo在索引3处...最终大小由较大的索引给出,并且未明确给出索引的所有值都设置为null。
如前所述应为sizeof(char *)
。循环打印内容;如果数组中元素的数量为3,则索引必须从0到2,(2 <3但3 <3为假),因为C中的索引基数为0。