#include <stdio.h>
int main(void)
{
int x = 99;
int *pt1;
pt1 = &x;
printf("Value at p1: %d\n", *pt1);
printf("Address of p1 (with %%p): %p\n", pt1);
printf("Address of p1 (with %%d): %d\n", pt1);
return 0;
}
使用%d
代替%p
打印机指针值的缺点/危险是什么?
答案 0 :(得分:5)
%d显示一个整数 - 指针的大小不需要等于整数的大小。
答案 1 :(得分:4)
sizeof(int *)不必等于sizeof(int)
库实现可以自由地使用不同的,更合适的指针值表示(例如十六进制表示法)。
%p简直就是“正确的事”。这是标准所说的应该用于指针,而使用%d是滥用整数说明符。
想象一下当有人重构你的代码时会发生什么,并且过度热情地将所有“int”与“long”和所有“%d”与“%ld”交换... oops。
答案 2 :(得分:2)
如果系统指针的大小与int
的大小不同,则可以导致无限量的拧紧。如果它们碰巧大小相同,那么你可能很安全。然而,就语言标准而言,传递指针并将其视为整数可以放火焚烧你的计算机,向你的老板发送色情电子邮件,或者让恶魔飞出你的鼻子。它可能不会做任何这些事情,但它可以设想打印出误导性的价值观等等。
不要这样做。使用%p
除非您迫切需要将地址视为整数(注意:您可能不会);在这种情况下,实际上将它转换为整数类型,这样你就不会滥用参数传递机制。
答案 3 :(得分:0)
我不知道危险和缺点,但是使用%d表示法会丢失指针格式(12 vs 0x000012)。
答案 4 :(得分:0)
除了其他答案中指出的危险之外,一些编译器(例如,打开了格式字符串警告的gcc)将生成警告,表明您正在向%d
传递指针,该指针需要int
1}}。