【问题标题】:Why doesn't c replace *b?为什么c不替换*b?
【发布时间】:2019-09-05 14:19:36
【问题描述】:

我有这个程序:

    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编译,但是我用一些在线编译器试过,结果还是一样)

【问题讨论】:

  • 为什么c“替换”a?您通过取消引用指向超出范围的变量的指针来调用未定义的行为。
  • 因为 a 已从堆栈中移除,而 c 应位于顶部,替换 a。
  • @EugeneSh。 ac 的范围不重叠并且它们具有相同的类型,因此人们可能期望编译器为它们分配相同的地址和/或注册。但当然,您实际上不允许做出这样的假设,并且代码会调用未定义的行为。
  • 假设太多了。没有人保证它将从堆栈中删除。甚至没有人保证它会被放入堆栈。
  • 基本上你是在问这个:“我用手指指着停车场上的一辆车。有人走进车里开走了。我仍然指着它停的地方。另一个不同的地方车进了停车场,怎么没有停在我指的地方?”好吧,为什么会这样?没有法律强制司机停在那里。或者在任何地方停车。

标签: c scope undefined-behavior lifetime


【解决方案1】:

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

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

并且尝试取消引用它。

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

来自 C 标准(6.2.4 对象的存储持续时间)

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

【讨论】:

    猜你喜欢
    • 2018-06-22
    • 1970-01-01
    • 2011-04-05
    • 2022-09-22
    • 1970-01-01
    • 2017-12-26
    • 2015-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多