我正在编写一个C ++程序来测试我的指针和参考知识,因此抓住了一个地址,我无法修改它中的值0; 知道为什么会这样吗?我将这条线命名为"越野车线"
#include <iostream>
using namespace std;
int main()
{
int value = 6;
int* point = &value;
int value2 = 9000;
*point = 5;
point = &value2;
point+=4000;
*point = 0; //the buggy line
cout << *point << endl;
cout << value;
}
答案 0 :(得分:1)
point
是int*
,所以在此行之后
point+=4000;
您现在指的是4000
int
个地址超过value2
。你不能尝试写入那个地址,因为你没有分配它。
答案 1 :(得分:1)
*point = 0; //the buggy line
不,这不是马车线。
point+=4000;
这是越野车线。此语句将指针值提前4000 * sizeof(int)。
这显然不是你想要的。
你在这里忘记了一个星号。
答案 2 :(得分:0)
point+=4000;
*point = 0; //the buggy line
这两行将指针移动4000个字节并尝试在那里写入。这是不允许的,因为您不拥有指针现在指向的内存(或者实际上存在更严格的规则)。因此,具有该内存的任何操作都可能会产生不同的意外结果,包括崩溃。
请注意,我说&#34;可以有#34;而不是&#34;必须有&#34;。这就是所谓的Undefined behavior:写入可以成功,可以工作,但写入不同的值,可以现在或以后崩溃您的程序,可以格式化您的驱动器等。它甚至可以读取成功,但写才不是。该语言无法保证具体结果。
事实上,在大多数实现和典型情况下,只要你不走远,它似乎会起作用(尽管可能会覆盖其他重要数据),但是当你走得更远时,它会使你的程序崩溃。 / p>