Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 静态初始化结构中的数组_C_Arrays_Gcc_Initialization_Gnu - Fatal编程技术网

C 静态初始化结构中的数组

C 静态初始化结构中的数组,c,arrays,gcc,initialization,gnu,C,Arrays,Gcc,Initialization,Gnu,这里不介绍其他编译器,但在GNU GCC编译器中,您可以使用以下语法静态初始化数组: struct some_struct { unsigned *some_array; } some_var = { .some_array = (unsigned[]) { 1u, 2u, 3u, 4u, 5u, }, }; 首先,我遇到了这个语法,它是为了寻找一个我关心并想回答的问题的答案。但我还没有找到任何指向GNU引用的链接,这些链接涵盖了这种语法 如果有人能给我一个关于

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

struct some_struct {
        unsigned *some_array;
} some_var = {
        .some_array = (unsigned[]) { 1u, 2u, 3u, 4u, 5u, },
};
首先,我遇到了这个语法,它是为了寻找一个我关心并想回答的问题的答案。但我还没有找到任何指向GNU引用的链接,这些链接涵盖了这种语法


如果有人能给我一个关于这个语法的链接,我将不胜感激。谢谢大家!

您可能不会在这方面找到太多GNU文档,因为它不是GCC扩展-这是称为复合文字的标准C语法的一部分。第6.5.2.5节和第6.7.9节对其进行了定义(第6.5.2.5节和第6.7.9节涵盖了大括号之间的部分,这对于复合文字和静态初始值设定项都是相同的,因此本标准只描述了一次)

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


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

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

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


还要记住,复合文字
(unsigned[]){1u,2u,3u,4u,5u,}
的生存期由它出现的范围决定。如果在局部范围内执行上述操作,则复合文字数组将在块的末尾被销毁。指针值(如果您设法将其移出该块)将变得无效。

这是一个复合文字,在C99中引入,]@mesmerizingsnow:您在“静态初始化”中的“静态”到底是什么意思?@AndreyT在这里给出一些答案(包括您的答案)之前,我都不确定。