%d
不是处理指针(地址)的正确格式说明符.您应该使用%p
并转换相应的参数来void*
打印地址.对特定格式说明符使用错误的参数类型会调用未定义的行为.
引用C11
章节§7.21.6.1
[...]如果任何参数不是相应转换规范的正确类型,则行为未定义.
*p
无论如何,在此代码中,并不表示地址.
您只能%d
在单个格式字符串中使用s 来打印数组.你需要一个循环.在你的代码中,
printf("%d\n%d\n%d\n%d\n%d\n", p, *p);
格式字符串需要5 int
秒作为参数,而您只提供一个指针和一个int
.FWIW,为提供的转换说明符提供的参数不足也会调用未定义的行为.引用相同的标准,
[...]如果格式的参数不足,则行为未定义.[...]
详细说明,替换
printf("%d\n%d\n%d\n%d\n%d\n", p, *p);
通过
for (i= 0; i < 5; i++, p++) printf("%d %p\n", *p, (void *)p);