#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
我没有得到这样的输出结果,请解释
答案 0 :(得分:2)
我只能假设,预期的行为是使用指针使变量v
递增10倍。
如果正确,那么您有两个错误:
int
变量,则应使用int *
指针。for
循环条件下:在每次迭代中,您都在同时递增i
和p
(i++,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指针更新整数内的字节。