在结构内静态初始化数组

时间:2014-08-13 16:26:24

标签: c arrays gcc initialization gnu

不会代表其他编译器,但在GNU GCC编译器中,您可以使用以下语法静态初始化数组:

struct some_struct {
        unsigned *some_array;
} some_var = {
        .some_array = (unsigned[]) { 1u, 2u, 3u, 4u, 5u, },
};

首先,我遇到了这种语法,搜索了我所关注的问题的答案,然后来到this回答。但我还没有找到任何GNU参考的链接,它涵盖了这种语法。

如果有人与我分享关于此语法的链接,我将非常感激。谢谢!

2 个答案:

答案 0 :(得分:2)

好吧,如果您的问题是关于复合文字语法,那么这里的一个重要细节是您没有在结构中初始化数组。您正在初始化结构中的指针。您现在拥有的代码是正式的。

如果你的结构中确实有一个数组,那么使用复合文字进行初始化是行不通的。您无法从另一个数组初始化数组。数组不可复制(字符串文字中的char数组初始化除外)。但是,在这种情况下,您可以使用普通的{}封闭的初始化程序,而不是复合文字。

另请注意,复合文字(unsigned[]) { 1u, 2u, 3u, 4u, 5u, }的生命周期取决于它出现的范围。如果在本地范围内执行上述操作,则复合文字数组将在块的末尾被销毁。

指针值(如果你以某种方式设法将它带到该块之外)将失效。

答案 1 :(得分:1)

您不太可能在此找到很多GNU文档,因为它不是GCC扩展 - 这是标准C语法的一部分,称为复合文字。它在C standard中的6.5.2.5和6.7.9节中定义(后者涵盖了大括号之间的部分,对于复合文字和静态初始化器都是相同的,所以标准只描述了一次)

您也可以使用此语法来描述动态对象值,而不仅仅是静态初始化,甚至可以单独站在表达式中而不必分配给任何变量。复合文字基本上可以出现在变量名称可以出现的任何地方:您可以将它们传递给函数,创建它们只是为了访问一个元素,获取它们的地址(您甚至可以将分配给它们,尽管它可以#39这不是很明显的有用的方法。

语法在所有C值类型中是统一的,可用于创建数组(指定要使用[N]=设置的特定元素),结构和联合(使用.field=指定特定元素)甚至数字类型(没有元素,所以不要指定,只需将值放在大括号之间)。语法旨在简单且一致,以便生成宏和代码生成器(除了优雅地手动编写)。