想知道为什么当下面的函数运行时,* p和p被打印出来具有相同的值。我的理解是,当* p ++运行时,这会导致p的地址递增1,但为什么这会导致* p也成为内存地址。
我也试过在没有*(只是p ++)的情况下运行代码,输出仍然是相同的,演讲代码中*
的重要性是什么。
我得到的输出是:
1606416248 1606416248
int main() {
int *p;
int a = 4;
p = &a;
*p++;
printf("%d %u\n", *p, p);
}
答案 0 :(得分:5)
首先,%u
是用于打印地址的不正确的格式说明符。您应该使用%p
打印地址,并将参数强制转换为(void *)
。仅这一点就足以调用undefined behavior。
然后来
但为什么这会导致* p也成为内存地址。
<强> Undefined behavior 强>
当你执行*p++;
时,你正在跑出界限,因为p
指向单个变量,而不是数组。因此,下一次取消引用指针*p
,将是无效的内存访问,从而导致UB。之后的输出无论如何都不合理。