无法获得指针结果

时间:2019-01-24 11:57:41

标签: c pointers

#include<stdio.h>
void main()
{
    int v=10;
    char *p=&v;
    int i;
    for(i=0;i<10;i++,p++)
    {
        ++(*p);
        printf("%d",v);
    }
}

输出

11
267
65803
16843019
16843019
16843019

我没有得到这样的输出结果,请解释

2 个答案:

答案 0 :(得分:2)

我只能假设,预期的行为是使用指针使变量v递增10倍。

如果正确,那么您有两个错误:

  1. 指针的类型应与您指向的数据相同。如果您指向int变量,则应使用int *指针。
  2. for循环条件下:在每次迭代中,您都在同时递增ipi++,p++)。 当您增加指针时,它会移动到下一个存储单元(简单来说,实际上有点复杂)。 如果只想使用变量v,则不应修改指针本身,而只能修改其引用的变量。 因此,如果您删除p++部分,那么您将得到11, 12, 13, ...

为什么现在显示出如此奇怪的结果?仅仅因为在每次迭代中您都在更改指针(因此它指向其他存储单元)。指针在增量后引用的内存可能包含随机数据,我们可以看到这些数据。但是,这种方法包含不确定的行为,结果可能会有所不同。甚至可能终止程序。

但是,目前尚不清楚您期望得到什么样的行为,如果您能澄清更多,我想社区将能够为您提供更多帮助。

答案 1 :(得分:1)

  

我没有得到这样的输出结果,请解释

首先让我们对代码进行一些小的更改,然后以十六进制打印值:

int main() {
  int v = 10;
  char *p = (char*)&v;
  int i;
  printf("%8d (0x%08x)\n", v, v);
  for(i=0; i<sizeof(i); i++, p++)
  {
    ++(*p);
    printf("%8d (0x%08x)\n", v, v);
  }

  return 0;
}

输出:

      10 (0x0000000a)
      11 (0x0000000b)
     267 (0x0000010b)
   65803 (0x0001010b)
16843019 (0x0101010b)

所以这里发生的是int是四个字节-因此,我得到了循环打印的4个值(加上循环之前的打印)。

由于p是一个char指针,并且我的系统是小尾数,因此p首先将指向整数的LSB(最低有效字节),即“ 0a”,然后将该字节递增为“ 0b”。

p递增p++时,它将指向下一个字节,即“ 00”,并将该字节递增到“ 01”。因此,现在整数保存为“ 0000010b”(十进制为267)。重复此步骤两次,以使整数首先变为“ 0001010b”(十进制65803),然后变为“ 0101010b”(十进制16843019)。

在内存中看起来像:

After initialization: 0a 00 00 00
                      ^
                      |
                      p

After loop 1:         0b 00 00 00
                         ^
                         |
                         p

After loop 2:         0b 01 00 00
                            ^
                            |
                            p

After loop 2:         0b 01 01 00
                               ^
                               |
                               p

After loop 4:         0b 01 01 01
                                  ^
                                  |
                                  p

BTW:请注意,该标准不能保证此行为。标准没有很好地定义使用char指针更新整数内的字节。