究竟什么是%p,为什么它与使用%d打印指针的int值不同?

时间:2016-12-20 05:46:05

标签: c pointers aslr

#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保持不变。

4 个答案:

答案 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个字节)。