为什么递增指针会给出一个随机数,而不是内存地址

How come incrementing a pointer gives a random number as oppose to a memory address when?

本文关键字:随机数 一个 地址 内存 指针 为什么      更新时间:2023-10-16

为什么当我递增指针然后取消引用它时,我得到一个随机数?

这是我的代码:

 #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)++;

您需要取消引用指针,因为这会增加地址本身,而不是它指向的值。