%p 到底是什么?为什么它与使用 %d 打印指针的 int 值不同?
What exactly is %p and why is it different from printing the int value of pointer by using %d?
#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 保持不变。
用于打印指针。同样,您不使用 %d
打印浮点数,也不应使用 %d
.
打印指针
0x2 只是整数 2 的十六进制表示。
这就是为什么你看到输出
printf() 以十六进制格式打印变量 a 的值。如果要打印a的地址,执行以下操作
printf("%p",&a);
指针的大小不等于int的大小,所以你不能用%d代替%p,%p用于打印存储在指针变量中的值,同样使用%p和int变量是未定义的行为(如果您在指针和 int 具有相同大小的系统上,您可能会看到正确的结果,但作为 C 标准,它是未定义的行为)
sizeof int 由编译器定义,不同的编译器在单台机器上可能有不同的 int 大小,但指针大小由机器类型定义(8,16,32,64 位)
当您使用 %p
时
printf("%p\n",ptr);
%p
是指针的格式说明符,你得到了预期的结果
当您使用 %d
时
printf("%d\n",ptr);
%d
是有符号整数的格式说明符,您会得到意想不到的结果,因为 pointers
的大小(通常为 8 个字节)可能与 signed integers
的大小不同(通常是 4 个字节)。
#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 保持不变。
用于打印指针。同样,您不使用 %d
打印浮点数,也不应使用 %d
.
0x2 只是整数 2 的十六进制表示。 这就是为什么你看到输出
printf() 以十六进制格式打印变量 a 的值。如果要打印a的地址,执行以下操作
printf("%p",&a);
指针的大小不等于int的大小,所以你不能用%d代替%p,%p用于打印存储在指针变量中的值,同样使用%p和int变量是未定义的行为(如果您在指针和 int 具有相同大小的系统上,您可能会看到正确的结果,但作为 C 标准,它是未定义的行为)
sizeof int 由编译器定义,不同的编译器在单台机器上可能有不同的 int 大小,但指针大小由机器类型定义(8,16,32,64 位)
当您使用 %p
时
printf("%p\n",ptr);
%p
是指针的格式说明符,你得到了预期的结果
当您使用 %d
时
printf("%d\n",ptr);
%d
是有符号整数的格式说明符,您会得到意想不到的结果,因为 pointers
的大小(通常为 8 个字节)可能与 signed integers
的大小不同(通常是 4 个字节)。