c - C标准中生命周期规则的解释
问题描述
我正在编写一个 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
推荐阅读
- lua - Symbol not found: OpenSSL_version_num
- javascript - 如何在javascript的嵌套for循环中添加超时fn?
- c - C中最快的服务器
- r - 在 macos big sur m1 的 shell 脚本中找不到别名
- nlp - 使用手套向量比较两个语句之间的相似性时的关键错误
- flutter - 如何在flutter中上传和下载图像到ftp服务器?
- javascript - 动态模式不适用于 Laravel Yajra 数据表操作按钮
- javascript - Google Geocode API 返回不同的结果然后“google.maps.Geocoder”
- javascript - 混合精度算术:大整数尾数的大浮点除法算法?
- javascript - 如何使用 Express.js 和 Passport.js 重置 Oauth 身份验证批准