打印指针值

时间:2011-03-24 11:57:54

标签: c pointers

#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打印机指针值的缺点/危险是什么?

5 个答案:

答案 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}}。