【发布时间】:2018-10-03 13:41:04
【问题描述】:
#include<stdio.h>
int main()
{ int i;
int *p;
p = &i;
i=5;
printf("i = %d, p = %P, *p = %d\n",i,p,*p);
*p=6;
printf("i = %d, p = %P, *p = %d\n",i,p,*p);
return 0;
}
这段代码的输出是:
i = 5, p = %P, *p = -1009882308
i = 6, p = %P, *p = -1009882308
它应该在第一个语句和第二个语句中给出 *p=5 的位置 *p=6
【问题讨论】:
-
首先,我建议将
%P替换为%p。P格式说明符不存在。 -
我很惊讶你的编译器没有警告你有比说明符更多的“对象”。像我上面所说的那样替换格式说明符,您的问题应该得到解决。
-
查看this answer 了解为什么没有编译错误/警告。
-
@Tau 是的,我的编译器对 %P 发出了警告,但如果我们不关注它,那么对于 *p 它也应该返回 i 的值,即 5 然后 6
-
您似乎忘记启用一组好的警告。对于 GCC,我建议至少
-Wall -Wextra -Wwrite-strings;还可以考虑使用-Wpedantic -Warray-bounds来识别其他一些常见错误。