C 奇怪的数组初始化表达式?
以下代码的含义是什么?代码来自GCC的回归测试套件C 奇怪的数组初始化表达式?,c,arrays,gcc,compiler-construction,C,Arrays,Gcc,Compiler Construction,以下代码的含义是什么?代码来自GCC的回归测试套件 static char * name[] = { [0x80000000] = "bar" }; 在C99中,可以将数组索引指定给赋值,例如: static char * name[] = { [3] = "bar" }; 同: static char * name[] = { NULL, NULL, NULL, "bar"}; 数组的大小是4。检查一个在下运行的示例代码。在您的代码中,数组大小是0x8000001(它
static char * name[] = {
[0x80000000] = "bar"
};
在C99中,可以将数组索引指定给赋值,例如:
static char * name[] = {
[3] = "bar"
};
同:
static char * name[] = { NULL, NULL, NULL, "bar"};
数组的大小是4。检查一个在下运行的示例代码。在您的代码中,数组大小是0x8000001
(它是一个十六进制数)。注意:使用
0
初始化的未初始化元素
:
在ISOC99中,您可以按任意顺序给出元素,指定它们所应用的数组索引或结构字段名,GNUC也允许将其作为C89模式的扩展。此扩展在GNU C++中没有实现。
要指定数组索引,请在元素值之前写入[index]=
。比如说,
int a[6] = { [4] = 29, [2] = 15 };
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
相当于
int a[6] = { 0, 0, 15, 0, 29, 0 };
int a[6] = { 0, v1, v2, 0, v4, 0 };
int a[6] = { 0, 0, 15, 0, 29, 0 };
GNU扩展中还有一个有趣的声明:
另一种语法是在元素值之前写入[index]
,而不是=
,这种语法自GCC 2.5以来已经过时,但GCC仍然接受
要将一系列元素初始化为相同的值,请写入[first…last]=value
。比如说,
int a[6] = { [4] = 29, [2] = 15 };
int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 };
注意:数组的长度是指定的最大值加1
此外,我们可以将这种命名元素的技术与后续元素的普通C初始化相结合。没有指示符的每个初始值设定项元素应用于数组或结构的下一个连续元素。例如:
int a[6] = { [1] = v1, v2, [4] = v4 };
相当于
int a[6] = { 0, 0, 15, 0, 29, 0 };
int a[6] = { 0, v1, v2, 0, v4, 0 };
int a[6] = { 0, 0, 15, 0, 29, 0 };
当索引是字符或属于枚举类型时,标记数组初始值设定项的元素特别有用。例如:
int whitespace[256] = { [' '] = 1, ['\t'] = 1, ['\h'] = 1,
['\f'] = 1, ['\n'] = 1, ['\r'] = 1
};
这是C99指定的初始值设定项。括号中的值指定接收该值的索引。它被称为指定初始值设定项,C99中引入了该初始值设定项,gcc在GNU89中也支持它作为扩展,详情请参阅
int a[6] = { [4] = 29, [2] = 15 };
相当于
int a[6] = { 0, 0, 15, 0, 29, 0 };
int a[6] = { 0, v1, v2, 0, v4, 0 };
int a[6] = { 0, 0, 15, 0, 29, 0 };
在第一个示例中,
[3]=“bar”代码>-这是否真的将第三个元素(如您所示)或索引3(第四个元素)设置得更为自然?@Vicky forth element,[3]=“bar”
表示第三个索引,请检查