我有以下代码:
#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。
答案 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将返回相同的值(内存中值的位置。)