【问题标题】:Behaviour on setting a pointer to a dangling pointer将指针设置为悬空指针的行为
【发布时间】:2017-11-09 02:04:26
【问题描述】:

我遇到过一些断言,即设置指向不是标量地址或超出标量地址的指针的行为是未定义的(对数组有类似的限制)。

所以考虑一下:

int main()
{
    int* bar;
    {
        int foo = 1;
        int* b = &foo;
        bar = b;
    }     
    int* copy = bar;    
}

int* copy = bar; 的行为是否已定义? bar 不再指向标量,因为它超出了范围。

【问题讨论】:

  • dereferencing 它肯定是未定义的,但我对此并不完全确定。不过在实践中是没有问题的。

标签: c language-lawyer


【解决方案1】:

bar 的值在右括号后是不确定的。

引用 ISO/IEC 9899:2011,第 6.2.4 节 §2:

[…] 当指针指向(或刚刚过去)的对象到达其生命周期的终点时,指针的值变得不确定。

int* copy = bar; 的确切行为是模棱两可的 - 请参阅 eugene-sh 提供的 N1793 — Stability of indeterminate values in C11

【讨论】:

  • 哇。所以这意味着我不应该真的拿走副本。
  • @PaulLogue 有什么意义(如果您想回答这个问题,请将其添加到您的问题中)?但是,是的,这不是很安全。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 1970-01-01
相关资源
最近更新 更多