指针在C++中取消引用的随机行为

Random behavior with Pointer de-referencing in C++

本文关键字:随机 引用 取消 C++ 指针      更新时间:2023-10-16

我有以下代码:

#include <iostream>
using namespace std;
int main ()
{
    int myvar = 5;
    int * p;
    cout << "Hello2" << endl;
    *p = myvar;
    cout << "Hello" << endl;
    cout << p << endl;
    //cout << &myvar << endl;
}

我知道我没有通过初始化指针来做正确的事情。我只是在玩指针并注意到了这一点。问题是当我注释掉最后一行时,程序正常执行。但是一旦我取消注释该行,我就会出现分段错误。我不知道为什么myvar的打印地址会导致这种情况?myvar 是否因为指针取消引用而以任何方式被修改?我正在使用C++11。

int* p;
*p = myvar;

您正在创建一个未初始化的指针,然后派生该指针。这具有未定义的行为,因为p必须指向某些内容才能正确推导。因此,程序的行为无法推理。

尝试访问没有读取权限的虚拟内存地址时发生分段错误。

在您的情况下,局部变量p保存堆栈中未初始化的垃圾。您正在取消引用可能不可读的内存地址(例如,没有读取权限,因此尝试访问它时会出现分段错误)。

我不完全确定您的代码片段的目的,但以下代码将起作用,也许它会有所帮助:

int myvar = 5;
int *p = nullptr;
p = &myvar;
cout << myvar << endl;
cout << &myvar << endl;
cout << p << endl;
cout << *p << endl;

(注意:我使用了两行来设置"p",因为这就是您在代码段中的做法。 你可以很容易地只使用: int *p = &myvar; )

无论如何,这里有范围问题,因为只要myvar在作用域中,p才会有效;但是,这确实说明了指针的基础知识。 myvar 和 *p 将返回相同的值(指向的值),&myvar 和 p 将返回相同的值(值在内存中的位置)。