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

What happens if a pointer runs out of scope

本文关键字:什么情况 范围 指针 如果      更新时间:2023-10-16

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

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;中创建分段错误

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

函数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"。

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

您对分段错误的预期是正确的。但是所有随机访问内存都不会产生分段错误。如果随机访问的内存具有任何保护权限,则只有它会产生分段错误。如果它没有任何保护,那么您可以毫无问题地访问内存,但具有未定义的行为,因为您无法假设随机内存中的内容。这里有一个很好的图片解释。

相关文章: