如果指针超出范围会发生什么

时间:2016-01-29 10:13:10

标签: c++ pointers scope segmentation-fault

我有以下代码,我想知道为什么它可以正常工作:

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 << *nbr << std::endl;

中创建分段错误

为什么此代码不会出现分段错误?

2 个答案:

答案 0 :(得分:1)

函数addFive本身是正常的,但它应该写成:

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

指针的b范围没有任何问题,因为指针本身只是一个局部变量。

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

*nbr = 3;

你的主要应该像这样重写:

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

然后你可以在输出中可靠地预期'8'。

答案 1 :(得分:1)

  

为什么此代码不会出现分段错误?

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