奇怪的数组初始化表达式?

Posted

技术标签:

【中文标题】奇怪的数组初始化表达式?【英文标题】:Strange array initialize expression? 【发布时间】:2013-08-20 07:24:36 【问题描述】:

下面的代码是什么意思?代码来自 GCC 的回归测试套件。

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

【问题讨论】:

【参考方案1】:

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

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

等同于:

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

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

5.20 Designated Initializers:

在 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 
                        ;

【讨论】:

在您的第一个示例中,[3] = "bar"; - 是否真的设置了第三个元素(如您所示)或索引 3(第四个元素)看起来更自然? @Vicky 第四元素,[3] = "bar" 表示第三个索引,检查this working code【参考方案2】:

在C99中引入的称为designated initializer,gcc在GNU89中也支持它作为扩展,详见here。

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

等价于

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

【讨论】:

【参考方案3】:

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

【讨论】:

以上是关于奇怪的数组初始化表达式?的主要内容,如果未能解决你的问题,请参考以下文章

C语言数组或者枚举类型初始化时出现宏定义和包含头文件的奇怪语法

C语言数组或者枚举类型初始化时出现宏定义和包含头文件的奇怪语法

C语言数组或者枚举类型初始化时出现宏定义和包含头文件的奇怪语法

奇怪的java字符串数组空指针异常[重复]

C语言数组寻址

初始化数组的区别[关闭]