#include <stdio.h>
int main()
{
int *ptr;
int a=2;
ptr=&a;
printf("%p\n",ptr);
printf("%d\n",ptr);
printf("%p\n",a);
return 0;
}
我得到的输出是:
% ./a.out
0x7ffe12032c40
302197824
0x2
%
前两个输出的值发生变化(显然是因为ASLR),而0x2保持不变。
答案 0 :(得分:1)
指针的大小不等于int的大小,所以你不能使用%d代替%p,%p用于打印存储在指针变量中的值,也使用%p和int变量是未定义的行为(如果您在系统上哪个指针和int具有相同的大小,您可能会看到正确的结果,但作为C标准,它是一个未定义的行为)
sizeof int由编译器定义,不同的编译器在单机上可能有不同的int大小,但指针大小由机器类型定义(8,16,32,64位)
答案 1 :(得分:0)
用于打印指针。以同样的方式,您不能使用%d
打印浮点数,您不应该使用%d
打印指针。
答案 2 :(得分:0)
0x2只是整数2的十六进制表示。 这就是你看到输出
的原因printf()以十六进制格式打印变量a的值。如果要打印a的地址,请执行以下操作
printf("%p",&a);
答案 3 :(得分:0)
在
中使用%p
时
printf("%p\n",ptr);
%p
是指针的格式说明符,您可以获得预期的结果
在
中使用%d
时
printf("%d\n",ptr);
%d
是有符号整数的格式说明符,因为pointers
(通常为8个字节)的大小可能与signed integers
的大小不同,所以会得到意外的结果(这是通常是4个字节)。