【问题标题】:Dereferencing a preincremented pointer is giving odd result取消引用预增量指针会产生奇怪的结果
【发布时间】:2012-10-17 03:33:54
【问题描述】:

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

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

}

在这段代码中,我得到的输出为: 旧 p=0x22ff08 p=oxa

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

【问题讨论】:

  • 未定义的行为。
  • “增加较早的地址并将 10 分配给该位置”是什么意思?你期待什么结果?
  • 我的想法是,指针变量可能指向新位置 0x22ff0C 并尝试在那里输入值。但现在我明白了。感谢 R.Martinho。谢谢你们。

标签: c++ pointers dereference pre-increment


【解决方案1】:

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

去什么地方? 没有这样的位置p 指向一个 int,而不是ints 的数组。这种增量产生的指针并不指向您可以执行间接操作的位置。像这段代码那样尝试这样做有未定义的行为,这意味着绝对有可能发生任何事情。编译器可以随心所欲地做任何事情,因为对需要发生的事情没有任何要求。不要这样做。

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

【讨论】:

  • 看看。我使用了同一个编译器的两个不同版本,得到了两个不同的结果:ideone.com/eTnODliveworkspace.org/code/20bde3a566de683718bf122ef699e7f3。这不仅仅是获得不同输出的问题。事实上,使用第一个,程序 crash 并出现分段错误(看看它在哪里显示“结果:运行时错误 [...] (SIGSEGV)”)
  • 我现在有一个 ideone 的替代品。使用最新版本的 GCC 和 Boost。谢谢。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2015-10-04
      • 2016-12-01
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多