为什么c不替换* b?

时间:2019-09-05 14:19:36

标签: c scope undefined-behavior lifetime

我有这个程序:

    int* b;
    {
        int a = 5;
        b = &a;
    } //a gets destroyed here
    {
        int c = 7; //c replaces a?
        printf("c: %d\n", c);
    }
    printf("*b: %d", *b); //*b is still 5

为什么c不替换* b或类似的东西?是因为某些编译器优化(我正在使用clang进行编译,但是我已经尝试使用一些在线编译器,结果仍然相同)

1 个答案:

答案 0 :(得分:3)

程序具有未定义的行为,因为指针p在此语句的范围内具有无效值

printf("*b: %d", *b);

,并且尝试取消引用它。

该指针具有无效(不确定)值,因为它没有指向对象。指针早期指向的对象在此范围内不存在。

根据C标准(6.2.4对象的存储时间)

  
      
  1. ...如果在生命周期之外引用对象,则行为为   未定义。指针的值不确定   当它指向(或刚刚过去)的对象到达其末端时   一生。
  2.