什么%d打印&变量而不是C中的%p

时间:2017-04-03 21:53:11

标签: c

此代码将打印我的年龄的my_age和内存地址。

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 

int my_age = 24;        
printf("%d \t %p",my_age, &my_age); 
}

但是当我使用%d而不是%p时,它将打印一个不同的值,该值是什么?

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 

int my_age = 24;        
printf("%d \t %d",my_age, &my_age); 
}

2 个答案:

答案 0 :(得分:6)

编译代码时,%d用作&amp; my_age之类的指针,你应该收到类似的警告:

printf.c:10:1: warning: format ‘%d’ expects argument of type ‘int’, but argument 3 has type ‘int *’ [-Wformat=]

这是因为您使用了错误的格式选项,这会导致未指定的行为。结果取决于架构和实现。换句话说,不可预测。不要这样做。

例如,在我的计算机上,%d需要4字节值,而像&amp; my_age这样的地址是8字节值。在我的计算机上,这导致printf显示指针的最不重要的4个字节(其msbit中为1,因此被解释为负4字节整数)。

#include <stdio.h> 
#include <stdlib.h> 

int main(){ 

int my_age = 24;        
printf("sizeof(my_age)=%d, sizeof(&my_age)=%d\n", sizeof(my_age), sizeof(&my_age));
printf("%d \t %p\n",my_age, &my_age); 
printf("%d \t %d\n",my_age, &my_age); 
}

输出结果:

sizeof(my_age)=4, sizeof(&my_age)=8
24   0x7ffdf27cb52c
24   -226708180

指针的最低有效4字节十六进制值为f27cb52c,并被解释为十进制-226708180。

由于细节取决于体系结构,因此您的结果可能会有所不同。 有关详细信息,请参阅帖子here

底线:确保在测试代码之前解决所有警告。

答案 1 :(得分:2)

%p以十六进制显示地址

%d显示十进制地址

%x将以十六进制显示

您可以在ANSI C中使用的%说明符是:

常用变量类型显示

%c char single character
%d (%i) int signed integer
%e (%E) float or double exponential format
%f float or double signed decimal
%g (%G) float or double use %f or %e as required
%o int unsigned octal value
%p pointer address stored in pointer
%s array of char sequence of characters
%u int unsigned decimal
%x (%X) int unsigned hex value

Reference