如果我的计算机是32位系统,它有32位地址吗?但是当我在C中打印任何内存地址时,为什么我会得到一个<32bit的地址?

时间:2016-05-16 14:18:40

标签: c pointers printf format-specifiers

例如

printf("%u",&a);

给我输出

  

65524

这是一个16位地址。

3 个答案:

答案 0 :(得分:4)

因为您使用了错误的格式说明符来调用undefined behavior

要打印指针,您应该使用%p格式说明符并将参数强制转换为void*。像

这样的东西
 printf("%p",(void *)&a);

将完成这项工作。

那就是说,你应该首先考虑virtual memory的概念。

答案 1 :(得分:1)

您还可以通过检查任何指针的大小而不是测试变量的地址来简单回答您关于地址大小的假设:

printf("%zu\n", sizeof(int*));
printf("%zu\n", sizeof(float*));

假设所有系统中的一个字节等于8位,您可以看到地址的大小。

请参阅此SO post

答案 2 :(得分:0)

要找到(大多数)当前常见系统的最高可能地址,请执行以下操作:

#include <stdint.h>
#include <stdio.h>

int main(void)
{
  uintptr_t uip = (uintptr_t) -1;
  void * vp = (void*) uip;

  printf("%p\n", vp);
}