取消引用预先指定的指针会产生奇怪的结果

时间:2012-10-17 03:33:55

标签: c++ pointers dereference pre-increment

这个问题一定是个愚蠢的问题,但我无法理解为什么会发生这种情况

int main()
{
    int i=20;
    int *p=&i;
    cout<<"old p="<<p<<endl;
    *(++p) = 10;
    cout<<"p="<<p<<endl;

}

在这段代码中我得到的输出为: 旧p = 0x22ff08 P =氧杂

为什么指针的值变为10(0xa)而不是递增先前的地址并将10分配给该位置?

3 个答案:

答案 0 :(得分:4)

  

为什么指针的值变为10(0xa)而不是递增先前的地址并将10分配给该位置?

到什么地方? 没有这样的位置p指向一个 int,而不是int的数组。由此增量产生的指针不指向可以执行间接寻址的位置。试图这样做的代码确实有未定义的行为,这意味着任何事情都可能发生。编译器可以随意做任何事情,因为对于需要发生的事情没有要求。不要这样做。

在您的特定实验中,出现两个变量彼此相邻,并且当递增时,变量p最终指向自身,然后分配10,这是十六进制的A.当您使用不同的编译器版本或编译器选项进行编译时,或者即使您对代码进行看似无辜的更改时,也无法保证再次发生这种情况。不要这样做。

答案 1 :(得分:1)

您正在尝试通过递增指针来访问可能已被占用或正在被其他程序/进程使用的位置,并且您正试图覆盖该值。

答案 2 :(得分:1)

通过将指针递增一个元素,实际上您正在访问相同的指针并将其值修改为0xA,因为它们按顺序位于内存中。