21

以下代码的含义是什么?代码来自 GCC 的回归测试套件。

static char * name[] = {
   [0x80000000]  = "bar"
};
4

3 回答 3

28

在 C99 中,您可以指定分配值的数组索引,例如:

static char * name[] = {
   [3]  = "bar"  
};

等同于:

static char * name[] = { NULL, NULL, NULL, "bar"};

数组的大小是四。检查在ideaone工作的示例代码。在您的代码中,数组大小是0x80000001(它是一个十六进制数)。
注意:使用 . 初始化的未初始化元素0

5.20 指定初始化器

在 ISO C99 中,您可以按任何顺序给出元素,指定它们适用的数组索引或结构字段名称,GNU C 也允许这作为 C89 模式的扩展。此扩展未在 GNU C++ 中实现。要指定数组索引,请写[index] =在元素值之前。例如,

 int a[6] = { [4] = 29, [2] = 15 };

相当于

 int a[6] = { 0, 0, 15, 0, 29, 0 };

在 GNU 扩展中可以有一个更有趣的声明:

自 GCC 2.5 以来已经过时但 GCC 仍然接受的另一种语法是[index]在元素值之前写入,没有=.

要将一系列元素初始化为相同的值,请编写[first ... last] = value. 例如,

 int widths[] = { [0 ... 9] = 1, [10 ... 99] = 2, [100] = 3 }; 

注意:数组的长度是指定的最大值加一。

此外,我们可以将这种命名元素的技术与连续元素的普通 C 初始化结合起来。每个没有指示符的初始值设定项元素都应用于数组或结构的下一个连续元素。例如:

 int a[6] = { [1] = v1, v2, [4] = v4 };

相当于

 int a[6] = { 0, v1, v2, 0, v4, 0 };

当索引是字符或属于枚举类型时,标记数组初始值设定项的元素特别有用。例如:

 int whitespace[256]  = { [' '] = 1,  ['\t'] = 1, ['\h'] = 1,
                          ['\f'] = 1, ['\n'] = 1, ['\r'] = 1 
                        };
于 2013-08-20T07:27:17.093 回答
8

它被称为指定初始化器,在 C99 中引入,gcc 在 GNU89 中也支持它作为扩展,详见此处

 int a[6] = { [4] = 29, [2] = 15 };

相当于

 int a[6] = { 0, 0, 15, 0, 29, 0 };
于 2013-08-20T07:29:52.790 回答
5

它是 C99指定的初始化程序。括号中的值指定接收值的索引。

于 2013-08-20T07:28:17.707 回答