int类型的指针在递增后在内存中移动1个地址

时间:2015-03-21 17:24:09

标签: c++ pointers increment

代码按预期工作,直到第22-24行,我们打印8后跟地址。递增指针地址仅将地址递增一个字节,而它应将地址移动4个字节。数组中不会出现此问题,或者如果单独运行第22-24行。

#include<iostream>
using namespace std;

void main()
{
   int *p;
   //int a[10] = { 0 };
   //p = a;
   int a = 100;
   p=&a;
   cout << "1.    "<<p <<"    "<<*p<< endl;
   p++;
   cout << "2.    " << p << "    " << *p << endl;
   ++p;
   cout << "3.    " << p << "    " << *p << endl;
   ++*p;
   cout << "4.    " << p << "    " << *p << endl;
   ++(*p);
   cout << "5.    " << p << "    " << *p << endl;
   ++*(p);
   cout << "6.    " << p << "    " << *p << endl;
   *p++;
   cout << "7.    " << p << "    " << *p << endl;
   (*p)++;      //This is the problem, increments the address by 1,    even though its in int type
   cout << "8.    " << p << "    " << *p << endl;
   *(p)++;
   cout << "9.    " << p << "    " << *p << endl;
   *++p;
   cout << "10.    " << p << "    " << *p << endl;
   *(++p);
   cout << "11.    " << p << "    " << *p << endl;
   cin.get();
}

2 个答案:

答案 0 :(得分:0)

最初,您将p设置为指向堆栈上的整数变量。当您随后递增指针时,您指向堆栈上的内存区域,该区域可能在调用函数时发生更改(例如cout)。当函数返回时,它可能已经改变了你的递增指针p指向的内存位置,这可能解释了你的问题。 您应该声明一个足够大的数组,以容纳您要逐步执行的指针地址范围。我注意到你注释掉了可以按预期工作的数组代码。

答案 1 :(得分:0)

您的代码是:

p = &a;
p++;

现在p指向a的末尾。这仍然可以,但是在下一行:

cout << "2.    " << p << "    " << *p << endl;

当您编写*p时,会尝试读取a结束后的内存,这会导致undefined behaviour

当发生未定义的行为时,C ++语言的定义不再涵盖程序的功能。任何事情都可能发生。

换句话说:在生成可执行文件时,编译器可以基于您的程序只执行定义良好的前提来做出假设。

你的输出也许可以通过编译器做出这样的假设来解释,如果你的程序确认了这个假设是合理的,但实际上是错误的,因为你的程序是无效的。

我想到的一个解释是,您提前p,直到它恰好指向存储p本身的内存位置。编译器通过输出用于递增存储在(*p)++指向的位置的int的指令来实现p。在您的系统上,将此指令应用于实际存储p的位置的结果是将p的地址值增加1。