C标准中使用寿命规则的说明

rea*_*esk 6 c compiler-construction

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

在经历“对象的存储期限”部分时,一种情况使我感到困惑:

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

我无法想象这种情况在讨论什么情况,尤其是数组成员部件(由于两个具有临时生存期的非左值,具有数组成员的结构与普通的非左值有什么区别吗?)有人可以给我代码吗?例子来说明这一点?

n. *_* m. 5

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

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)