在结构体内静态初始化数组

5
在GNU GCC编译器中,您可以使用以下语法静态初始化数组:
struct some_struct {
        unsigned *some_array;
} some_var = {
        .some_array = (unsigned[]) { 1u, 2u, 3u, 4u, 5u, },
};

我最初遇到这个语法是在查找我关心的问题的答案时,然后找到了这个答案。但我还没有找到任何涵盖此类语法的GNU参考链接。

如果有人能分享这种语法的链接,我将非常感激。谢谢!


8
这是一个复合字面量,在C99中引入,[更多信息]。 - David Ranieri
@mesmerizingsnow:在“静态初始化”中,“静态”具体是什么意思? - AnT stands with Russia
@AndreyT 在这里收到几个答案(包括你的)之前,我不确定。 - mesmerizingr
2个回答

2
如果您的问题涉及到复合字面量语法,那么其中一个重要细节是您不是在结构体中初始化数组,而是在结构体中初始化指针。您现在拥有的代码在形式上是正确的。
如果您真的在结构体内部有一个数组,那么使用复合字面量进行初始化将行不通。您不能从另一个数组初始化数组。数组是不可复制的(除了从字符串字面量初始化的char数组)。但是,在这种情况下,您可以使用普通的{}括号进行初始化,而不是复合字面量。
此外,请记住,复合字面量(unsigned[]) { 1u, 2u, 3u, 4u, 5u, }的生命周期由其出现的范围确定。如果您在局部作用域中执行上述操作,则复合字面量数组将在块结束时被销毁。指针值(如果您以某种方式将其带出该块)将变为无效。

1
您不太可能在GNU文档中找到有关此内容的信息,因为它不是GCC扩展,而是标准C语法的一部分,称为“复合字面量”。它在C标准的6.5.2.5和6.7.9节中进行了定义(后者涵盖了大括号之间的部分,这对复合字面量和静态初始化程序都是相同的,因此标准只描述了一次)。
您可以使用此语法来描述动态对象值,而不仅仅是用于静态初始化,甚至可以在表达式中独立存在而没有被分配给任何变量。复合字面量可以出现在几乎任何变量名称可以出现的地方:您可以将它们传递给函数,仅创建它们以访问一个元素,取其地址(您甚至可以将其分配给它们,尽管它的实用性并不明显)。
语法在所有C值类型中都是统一的,可以用于创建数组(指定要设置的特定元素[N]=)、结构体和联合体(使用.field=指定特定元素),甚至数字类型(没有元素,因此不需要指定,只需将值放在大括号之间)。该语法旨在为宏和代码生成器生成提供简单和一致的方法(除了手写外还优雅)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接