C 使用对象本身的地址初始化对象
这在C99和C11中有定义吗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
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。