我有以下代码,我想知道为什么它可以正常工作:
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;
为什么此代码不会出现分段错误?
答案 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。