【问题标题】:What happens if a pointer runs out of scope如果指针超出范围会发生什么
【发布时间】:2016-01-29 10:13:10
【问题描述】:

我有以下代码,我想知道它为什么会这样工作:

void addFive(int* a) {
    int* b;
    b = a;
    *b = *b + 5;
}

int main(int argc, char** argv) {

    int* nbr;
    *nbr = 3;
    addFive(nbr);
    std::cout << *nbr << std::endl;

    return 0;

}

这会产生 8 的输出。

我想知道为什么?指针 int* b 在 addFive 函数末尾超出范围。此外,int* b 不知道int* nbr 的存在(智能指针的一个优点)。我预计代码会在 std::cout &lt;&lt; *nbr &lt;&lt; std::endl; 行中创建分段错误

为什么这段代码没有给出分段错误?

【问题讨论】:

  • int *nbr; *nbr = 3; 您正在访问不属于您的随机内存。该示例具有 UB。
  • 未初始化的指针 = 未定义的行为。你也永远不会让nbr 指向任何东西。

标签: c++ pointers scope segmentation-fault


【解决方案1】:

函数addFive本身是正常的,但应该这样写:

void addFive(int* a)
{
   *a += 5;
}

并且指针的b 作用域没有任何问题,因为指针本身只是一个局部变量。

您的代码中的真正问题是您没有为整数分配内存并试图通过指针nbr 访问未初始化的内存,这会导致您出现未定义的行为。在我的机器上,这一行出现分段错误:

*nbr = 3;

你的 main 应该这样重写:

int* nbr = new int(3);
addFive(nbr);
std::cout << *nbr << std::endl;
return 0;

那么您可以在输出中可靠地期待“8”。

【讨论】:

    【解决方案2】:

    为什么这段代码没有给出分段错误?

    您对分段错误的预期是正确的。但是所有内存的随机访问都不会产生分段错误。如果随机访问的内存有任何protection rights,那么只有它会创建分段错误。如果它没有任何保护,那么您可以毫无问题地访问内存,但使用undefined behavior,因为您无法假设随机内存中的内容。一个好的图文解说是here

    【讨论】:

      猜你喜欢
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-03
      • 1970-01-01
      • 2011-01-17
      相关资源
      最近更新 更多