此代码将打印我的年龄的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);
}
答案 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