2011-03-24 199 views
2
#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

您可能要选择一个答案,“右”之一。 – DevSolar 2011-05-30 06:26:18

回答

5

%d显示的整数的 - 没有需要一个指针的大小等于一个整数的大小。

+1

我猜想在64位系统上(例如Windows 7 64位或Linux amd64),即使指针的大小是64位,int的大小也是32位样式。 – BenjaminB 2011-03-24 12:04:14

+3

如果大小不相等,并且你不投射,那么你是在说谎的VA_ARGS为printf,这是未定义的行为! – Flexo 2011-03-24 12:07:06

+1

@awoodland,不仅仅是它是UB,如果在'%d'之后还有另一个格式说明符,它将会出错,因为堆栈会被搞乱。 – 2011-03-24 12:39:44

2

如果您的系统指针发生不被大小为int小号一样,可以引起screwage无限量的。如果它们恰好相同,那么你可能是安全的。然而,就语言标准而言,传递一个指针并将其作为一个整数来处理它,可以让你的电脑着火,向你的老板发送色情电子邮件,或者使恶魔从你的鼻子飞出。它可能不会做任何这些事情,但它可能会打印出误导性的值或其他东西。

不要这样做。使用%p除非你迫切需要将地址视为一个整数(注意:你可能不需要);在这种情况下,实际上将其转换为整数类型,以便您不滥用参数传递机制。

0

我不知道危险和缺点,但是通过使用你失去像(12 VS 0x000012)格式化指针%d符号。

4
  • 的sizeof(INT *)不必等于sizeof(int)的

  • 库实现可以自由地使用指针值的一个不同的,更适当的呈现(例如,十六进制记数法)。

  • %p是简单的 “做正确的事”。这是标准所说的应该用于指针,而使用%d是滥用整数说明符。

想象一下,当有人refactors你的代码,有点过于狂热地交换所有的“整数”与“长”和所有“%d”和“%LD” ......哎呀发生了什么。

+0

好的谢谢。这是从我的懒惰思考,我很幸运,我们的架构上确实sizeof(int *)== sizeof(int)。自动十六进制符号很好。 – abishell 2011-03-25 09:45:18

+0

有趣。对我来说,第三点总是最强的论点。 ;-) – DevSolar 2011-03-25 14:15:04

0

除了危险,在其他的答案中指出,一些编译器(例如GCC与格式字符串警告开启)会生成您传递一个指针%d警告,其预计的int