gpt4 book ai didi

c - C11 与 C99 中临时对象的生命周期

转载 作者:太空狗 更新时间:2023-10-29 16:29:56 26 4
gpt4 key购买 nike

我正在尝试破译a note这导致了 C99 和 C11 之间的变化。该说明中提出的更改最终出现在 C11 的 6.2.4:8 中,即:

A non-lvalue expression with structure or union type, where the structure or union contains a member with array type (including, recursively, members of all contained structures and unions) refers to an object with automatic storage duration and temporary lifetime. Its lifetime begins when the expression is evaluated and its initial value is the value of the expression. Its lifetime ends when the evaluation of the containing full expression or full declarator ends. Any attempt to modify an object with temporary lifetime results in undefined behavior.

我明白为什么需要更改(可以找到一些讨论 here 。请注意,讨论可以追溯到 C11 之前)。然而,我不明白的是 Clark Nelson 在写他的笔记时的旁白:

Please note that this approach additionally declares an example like this, which was conforming under C99, to be non-conforming:

struct X { int a[5]; } f();
int *p = f().a;
printf("%p\n", p);

我明白为什么这个例子在 C11 下是不合格的。我特别不明白的是它是如何符合 C99 的。而且,如果它是在 C99 下定义的,那么它应该做什么,定义打印悬空指针的值?

最佳答案

我的理解是,在 C99 中,对象生命周期的最细粒度是 block 。因此,虽然 6.5.2.2(以及您引用的注释中提到的其他一些 §)明确表示您不能访问下一个序列点之后的返回值,但从技术上讲,它的地址不是不确定直到在您离开封闭 block 之后(不过,为什么您应该为无法访问的对象保留一些存储空间的原因留给读者作为练习)。因此,类似

struct X { int a[5]; } f();
int *p;
{ p = f().a; }
printf("%p\n", p);

在 C99 和 C11 中都是未定义的。在 C11 中,“临时生命周期”的概念在 C99 中不存在,允许考虑指针在完整表达式结束后立即变得不确定。

关于c - C11 与 C99 中临时对象的生命周期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12676411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com