rea*_*esk 6 c compiler-construction
我正在编写一个C编译器(以llvm作为后端)进行练习,并且遵循C11标准§6.2.4遵循规则。
在经历“对象的存储期限”部分时,一种情况使我感到困惑:
¶8具有结构或联合类型的非左值表达式,其中结构或联合包含具有数组类型的成员(递归地包括所有包含的结构和联合的成员)是指具有自动存储期限和临时生存期的对象。它的生命周期从对表达式进行求值开始,并且其初始值为表达式的值。当包含完整表达式或完整声明符的求值结束时,其生存期结束。任何试图使用临时生存期修改对象的尝试都会导致未定义的行为。
我无法想象这种情况在讨论什么情况,尤其是数组成员部件(由于两个具有临时生存期的非左值,具有数组成员的结构与普通的非左值有什么区别吗?)有人可以给我代码吗?例子来说明这一点?
其中没有数组的临时值不必引用具有自动(或实际上任何)存储持续时间的对象。数组之所以特别,是因为数组到指针的转换是一个可以对数组执行的唯一有用的操作,它隐式地要求它具有一个地址,因此编译器必须为其分配内存(并因此隐式地为整个对象分配内存)。包含它)。非数组左值没有地址。
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
Run Code Online (Sandbox Code Playgroud)
小智 1
struct Foo {
int i[1]; //structure contains a member with array type
};
struct Foo getFoo() {
struct Foo foo;
foo.i[0] = 1;
return foo;
}
void test() {
// getFoo().i life time begin;
int *p = getFoo().i; //A non-lvalue expression with structure type
// getFoo().i is automatic storage duration and temporary lifetime
// getFoo().i life time end;
assert(*p == 1); // Any attempt to modify an object with temporary lifetime results in undefined behavior.
}
Run Code Online (Sandbox Code Playgroud)