首页 > 解决方案 > C标准中生命周期规则的解释

问题描述

我正在编写一个 C 编译器(以 llvm 作为后端)进行练习,并且遵循C11 标准 §6.2.4的规则。

在浏览“对象的存储持续时间”部分时,一个案例让我感到困惑:

¶8 具有结构或联合类型的非左值表达式,其中结构或联合包含具有数组类型的成员(递归地,包括所有包含的结构和联合的成员)是指具有自动存储持续时间和临时生命周期的对象。它的生命周期从计算表达式时开始,它的初始值是表达式的值。当包含完整表达式或完整声明符的评估结束时,它的生命周期结束。任何修改具有临时生命周期的对象的尝试都会导致未定义的行为。

我无法想象这个案例谈论的是什么情况,尤其是数组成员部分(作为具有临时生命周期的非左值,具有数组成员的结构与普通的非左值有什么区别吗?)谁能给我一个代码举例说明这一点?

标签: ccompiler-construction

解决方案


没有数组的临时值不必引用具有自动(或实际上任何)存储持续时间的对象。数组是特殊的,因为数组到指针的转换,关于一个可以对数组执行的唯一有用的操作,隐式地要求它有一个地址,所以编译器必须为它分配内存(因此隐式地为整个对象分配包含它)。非数组左值没有地址。

struct a { int x; };
struct b { int y[2]; };
void foo(int*);
struct a one();
struct b two();

foo(&one().x); // not legal
foo(two().y); // legal, y has an address

推荐阅读