使用C ++中的指针解引用的随机行为

时间:2014-11-13 23:15:56

标签: c++ pointers segmentation-fault dereference

我有以下代码:

#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。

3 个答案:

答案 0 :(得分:0)

int* p;
*p = myvar;

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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

我不完全确定您的代码段的用途,但以下代码可以使用,也许它会有所帮助:

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

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

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