使用增量(* p ++ = x)引用指针会将* p的值更改为p

时间:2016-03-24 11:38:59

标签: c pointers memory int printf

#include <stdio.h>
int main(){
int i=1;
int * p = &i;
*(p++)=4;

printf("%p\n", p);   //0x7ffc000f47c8  
printf("%u\n", p);   //956816552 (which is 0x7ffc000f47c8 as unsigned integer) 
printf("%u\n", *p);  //956816552 (I would expect *p to be the value of whatever is in 0x7ffc000f47c8, and not the unsigned value of the pointer p (956816552))

return 0;
}

我希望printf()的{​​{1}}是0x7ffc000f47c8中的任何值,而不是指针*p的无符号值(956816552))

何时/如何将p的值设置为956816552(*p的值)??

我相信p不是UB。 (根据第一个答案的评论 - Undefined behavior and sequence points

任何帮助将不胜感激。谢谢。

2 个答案:

答案 0 :(得分:3)

执行增量p++后,p无法再解除引用,因为它不再指向对象。该程序为取消引用p调用未定义的行为,此时我们通常会说“程序错误”,修复程序,继续前进。

如果您对打印出来的确切值感到好奇,那么该值可能只是&i+1碰巧指出的意外,或者可能是其他内容。

注意:在这种情况下,增量本身是明确定义的。但是如果你再次增加指针,你就会遇到麻烦,因为你已经超过i的末尾。

答案 1 :(得分:1)

按以下方式更改程序

#include <stdio.h>
int main(){
int i=1;
int * p = &i;
*(p++)=4;

printf("%p\n", p);   //0x7ffc000f47c8  
printf("%u\n", p);   //956816552 (which is 0x7ffc000f47c8 as unsigned integer) 
printf("%d\n", i);  //956816552 (I would expect *p to be the value of whatever 
       ^^^^^^^^^
is in 0x7ffc000f47c8, and not the unsigned value of the pointer p (956816552))

return 0;
}

您将看到i被搁置。

陈述后

*(p++)=4;

指针p已更改并且现在指向变量x之外,因此您可能无法取消引用指针。