指针不修改地址?

Pointer not modifying the address?

我正在编写一个 C++ 程序来测试我的指针和引用知识,因此抓取了一个地址,但我无法修改其中的值 0; 知道为什么会这样吗?我将该行命名为 "buggy line"

#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;
}

point 是一个 int*,所以在这一行之后

point+=4000;

您现在指向 4000 int 个地址过去 value2。您不能尝试写入该地址,因为您没有分配它。

*point = 0;  //the buggy line

不,这不是越野车线。

point+=4000;

这是越野车路线。此语句将指针值增加 4000*sizeof(int).

这显然不是你想要的。

你在这里忘记了一个星号。

point+=4000;
*point = 0;  //the buggy line

这两行将指针移动 4000 字节并尝试在那里写入。这是不允许的,因为您不拥有指针现在指向的内存(或者实际上有更严格的规则)。因此,对该内存的任何操作都可能产生不同的意外结果,包括崩溃。

请注意,我说的是 "can have",而不是 "must have"。这就是所谓的Undefined behavior:写入可以成功,可以工作,但写入不同的值,现在或以后可以让你的程序崩溃,可以格式化你的驱动器等。甚至可以是读取成功,但写入才不是。语言不保证具体结果。

事实上,在大多数实现和典型情况下,只要你不走得太远,它似乎都能工作(尽管可能会覆盖其他重要数据),但当你走得更远时,它会使你的程序崩溃.