LIFE可以做C语言标识符吗,Lifetime(生命期)

C中的每个对象都有一个常量地址,保留其最后存储的值(除非值是不确定的),并且对于VLA来说,它的大小(自C99以来)保持在被称为该对象生命周期的一部分程序执行中。

对于使用自动,静态和线程存储持续时间声明的对象,寿命等于它们的存储持续时间(请注意非VLA和VLA自动存储持续时间之间的差异)。

对于具有已分配存储持续时间的对象,生命周期从分配函数返回(包括从中返回realloc)开始,并在realloc调用或释放函数被调用时结束。请注意,由于分配的对象没有声明类型,所以首先用于访问此对象的左值表达式的类型成为其有效类型。

在其生命周期外访问对象是未定义的行为。

int* foo(void) {

int a = 17; // a has automatic storage duration    return &a;}  // lifetime of a endsint main(void) {

int* p = foo(); // p points to an object past lifetime ("dangling pointer")

int n = *p; // undefined behavior}

指向其生命周期结束的对象(或对象之后的对象)的指针具有不确定的值。

临时寿命

包含由非左值表达式指定的数组成员(直接或嵌套结构/联合成员的成员)的结构和联合对象具有临时生存期。当包含完整表达式或完整声明程序结束时(自C11开始),对引用此类对象的表达式进行评估并结束于下一个序列点(直到C11)时临时生存期开始。

任何尝试修改具有临时生命周期的对象都会导致未定义的行为。

struct T { double a[4]; };struct T f(void) { return (struct T){3.15}; }double g1(double* x) { return *x; }void g2(double* x) { *x = 1.0; }int main(void){

double d = g1(f().a); // C99: UB access to a[0] in g1 whose lifetime ended                          //      at the sequence point at the start of g1                          // C11: OK, d is 3.15    g2(f().a); // C99: UB modification of a[0] whose lifetime ended at the sequence point               // C11: UB attempt to modify a temporary object}

参考

C11 standard (ISO/IEC 9899:2011):6.2.4 Storage durations of objects (p: 38-39)

C99 standard (ISO/IEC 9899:1999):6.2.4 Storage durations of objects (p: 32)

C89/C90 standard (ISO/IEC 9899:1990):3.1.2.4 Storage durations of objects

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值