Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.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_Initialization_Language Lawyer_C99_C11 - Fatal编程技术网

C 使用对象本身的地址初始化对象

C 使用对象本身的地址初始化对象,c,initialization,language-lawyer,c99,c11,C,Initialization,Language Lawyer,C99,C11,这在C99和C11中有定义吗 struct A { struct A* first; int value; }; { // inside a function struct A a = { &a }; a.first->value = 123; } 并使用说明符static: { // inside a function static struct A a = { &a }; a.first->val

这在C99和C11中有定义吗

struct A
{
    struct A* first;
    int value;
};

{    // inside a function
    struct A a = { &a }; 
    a.first->value = 123;
}
并使用说明符static:

{    // inside a function
    static struct A a = { &a }; 
    a.first->value = 123;
}

这是定义明确的行为

根据C标准§6.2.4(重点):

存在一个对象,有一个固定地址,,并在其整个生命周期中保留其最后存储的值

非静态结构的生存期从声明它的块的条目开始(称为自动存储持续时间):

对于这样一个没有可变长度数组类型的对象,其生存期从进入与其关联的块开始,一直到该块的执行以任何方式结束

如果在与声明关联的块中指定了初始化:

[初始化]在执行块时每次到达声明时执行;否则,每次到达声明时,该值都变得不确定

因此,在进入块时,结构保证了存储和一个常量地址,您可以在该结构的初始化中自由使用该地址,因为初始化保证在结构的生存期开始后发生

对于静态结构

它的生命周期是程序的整个执行过程,它的存储值在程序启动之前只初始化一次

因此,一旦程序执行开始,结构就有保证的存储和恒定的地址,并且它的存储值在该生命周期内但在标准执行协议之前初始化(调用
main()
,等等)

来源:。这些参考文献的C11文献是相同的


这是一个演示。这在
-std=c99-pedantic
-std=c11-pedantic
下编译时没有警告是的,这是很好的关联:OP最近在@alk;他在评论中问了这个问题,但提出了一个新问题。似乎没有关于这是否定义明确的简明信息,所以我很高兴有人问这个问题!更密切相关的,如果不是一个复制品:@alk你可能想编辑这个标题。我的广泛搜索没有找到它,因为它错误地使用了单词:reference。