为什么递增指针会给出一个随机数,而不是内存地址
How come incrementing a pointer gives a random number as oppose to a memory address when?
为什么当我递增指针然后取消引用它时,我得到一个随机数?
这是我的代码:
#include <iostream>
using namespace std;
int main(){
int reference = 10;
int *health = &reference;
int *health1 = health;
cout << "Health Address: " << health <<
"nHealth1 Address: " << health1 <<
"nReference Address: " << &reference << endl;
health1++;
cout << "Health1 value after being incremented then dereferenced: " << *health1 << endl;
}
我的输出是:
健康地址: 0x7fff5e930a9c
健康1 地址: 0x7fff5e930a9c
参考地址:0x7fff5e930a9c。
运行状况 1 值在递增然后取消引用后:197262882
我期望得到一个 0,因为下一个内存地址的下一个值将为 null,但在这种情况下并非如此。
我期望得到 0,因为内存中的下一个位置将为空,但在这种情况下并非如此。
你的期望是错误的。递增指针后,它不再指向有效的内存缓冲区。取消引用它会调用未定义的行为。
增加指针后,它指向程序未分配和初始化的内存,因此它不像预期的那样为 null。每次运行程序时,都可能会得到一个随机整数。
我认为您的误解来自您希望指针指向数组下一个元素的地址这一事实:
int myarray[] = { 1, 2, 3, 4, 5 };
int* parray = myarray;
std::cout << *parray << std::endl;
parray++; // increment the pointer, now points at the address of number 2
std::cout << *parray << std::endl;
但由于您的示例中没有数组,因此递增的指针指向下一个内存块。它指向的类型的大小(以字节为单位)将添加到指针中。那里有什么价值是任何人的猜测:
int myvalue = 10;
int* mypointer = &myvalue;
mypointer++;
取消引用此类指针是未定义的行为。当您超过分配给进程的内存时,将不会获得指针 null 值或取消引用的值 0
。
假设X
是指针T *p;
的值。
如果p
递增,则p
将指向地址X + sizeof(T)
然后,*p
将为您提供存储在地址 X + sizeof(T)
的值。现在根据地址的有效性 X + sizeof(T)
,您将获得结果,如果无效X + sizeof(T)
这可能是未定义的行为。
(*health1)++;
您需要取消引用指针,因为这会增加地址本身,而不是它指向的值。
相关文章:
- 如何在 c++ 中从数组中选择一个随机数?
- 创建一个带有随机数的向量
- 从大范围内生成一个随机数,但从大范围的中间开始生成较小的范围
- 如何在C++中创建数字列表,以便它可以选择一个随机数?
- 我在一个生成随机数的程序工作,我想将这些数字存储在一个数组中
- C++11 中的随机数:有没有一种简单的方法可以将生成器种子放在代码的一个位置,然后在不同的函数中使用它?
- 当尝试从 c++ 的文本文件中读取时,它会给我一个大的随机数
- 在随机数组中找到一个特定数字
- 在[0,1)C 之间生成一个随机数
- 在 Xcode 8.3 上构建一个C++正态分布式随机数生成器
- 在此过程中的纸牌游戏程序.不知道为什么我会得到一个随机数-858993460
- 为什么递增指针会给出一个随机数,而不是内存地址
- 如何使用Linux GetRandom系统调用来在范围内生成一个随机数
- 一个简单的程序来对随机数进行排序
- 如何在c++中生成一个介于1和16之间的随机数
- 生成一个小于4位的随机数,但其具有1、2或3位数字的概率相等
- visual如何在C++中创建一个随机数数组
- 从一个特定的范围中生成一定数量的唯一随机数
- 生成一个没有重复数字的随机数
- 生成一个没有重复的伪随机数和一个字母