为什么通过使用printf(%x)指针的值不同?

mko*_*mko 0 c printf pointers

#include <stdio.h>
int main(void)
{
  int *ptr;
  printf("The Hex value of ptr is 0x%x",ptr);
  printf("The pointer value of ptr is %p",ptr);
}
Run Code Online (Sandbox Code Playgroud)

和输出有些不同,我不知道为什么

The Hex value of ptr is 0x24a77950
The pointer value of ptr is 0x7fff24a77950
Run Code Online (Sandbox Code Playgroud)

它显示ptr的值是一个十六进制整数,但是十六进制输出缺少part 7fff

这是printf格式问题还是其他?

cod*_*ler 5

%x将指针转换为无符号整数(32位长度)。在64位计算机上,指针的长度为8字节(64位)。

使用%p进行打印将以其完整大小-64位打印整个指针。但是,当您使用%x打印时,仅低32位被打印。因此,使用%p打印指针始终是安全的。

您可以按照以下步骤添加额外的2行并进行验证:

printf("size of unsigned int is %lu\n", sizeof(unsigned int));
printf("size of pointer is %lu\n", sizeof(int *));
Run Code Online (Sandbox Code Playgroud)

在具有64位操作系统的64位计算机上,这应该分别给您4和8。

查看已回答的两个类似问题:问题1问题2