#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)
任何帮助将不胜感激。谢谢。
答案 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
之外,因此您可能无法取消引用指针。