-3
#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

4 回答 4

1

指针的大小不等于 int 的大小,所以你不能使用 %d 代替 %p,%p 用于打印存储在指针变量中的值,也使用 %p 和 int 变量是未定义的行为(如果你'在指针和 int 大小相同的系统上,您可能会看到正确的结果,但作为 C 标准,它是未定义的行为)

sizeof int 由编译器定义,不同的编译器在单机上可能有不同的 int 大小,但指针大小由机器类型定义(8,16,32,64 位)

于 2016-12-20T05:52:47.057 回答
0

它用于打印指针。以同样的方式,你不打印一个浮点数,%d你不应该用 . 打印一个指针%d

于 2016-12-20T05:49:04.133 回答
0

0x2 只是整数 2 的十六进制表示。这就是你看到输出的原因

printf() 以十六进制格式打印变量 a 的值。如果要打印a的地址,请执行以下操作

printf("%p",&a);
于 2016-12-20T05:51:19.480 回答
0

当您使用%p

printf("%p\n",ptr);

%p是指针的格式说明符,你会得到预期的结果

当您使用%d

printf("%d\n",ptr);

%d是有符号整数的格式说明符,您会得到意想不到的结果,因为pointers(通常为 8 个字节)的大小可能与signed integers(通常为 4 个字节)的大小不同。

于 2016-12-20T05:55:37.223 回答