- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试破译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/
我正在开发一个使用多个 turtle 的滚动游戏。玩家 turtle 根据按键命令在 Y 轴上移动。当危害和好处在 X 轴上移动时,然后循环并改变 Y 轴位置。我尝试定义一个名为 colliding(
我不明白为什么他们不接受这个作为解决方案,他们说这是一个错误的答案:- #include int main(void) { int val=0; printf("Input:- \n
我正在使用基于表单的身份验证。 我有一个注销链接,如下所示: 以及对应的注销方法: public String logout() { FacesContext.getCurren
在 IIS7 应用程序池中有一个设置 Idle-time out 默认是 20 分钟,其中说: Amount of time(in minutes) a worker process will rem
我是一名优秀的程序员,十分优秀!