指针在C++中取消引用的随机行为
Random behavior with Pointer de-referencing in C++
我有以下代码:
#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 将返回相同的值(值在内存中的位置)。
相关文章:
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 将对象数组的引用传递给函数
- 什么时候在C++中返回常量引用是个好主意
- 为什么 Serial.println(<char[]>);返回随机字符?
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 字符串-C++后显示的随机字符
- 何时在引用或唯一指针上使用移动语义
- 如何在c++中使用引用实现类似python的行为
- 编译C++时未定义的引用
- Ctypes wstring通过引用传递
- c++r值引用应用于函数指针
- 理解c++中的引用
- 循环中的随机函数
- CMake 引用我在 ~/bin 中创建的随机 shell 脚本(即使我删除了它)?
- 对随机整数的未定义引用
- 如何引用随机生成器
- 简单的代码,看似随机的结果——这是由于过时的引用造成的吗
- 是否可以引用随机类
- 指针在C++中取消引用的随机行为
- 使用引用运算符 (&) 为矩阵分配随机值