【问题标题】:If my computer is a 32 bit system, it has a 32 bit address right? But when I print any memory address in C why do I get an address <32bit?如果我的计算机是 32 位系统,它有 32 位地址,对吗?但是当我在 C 中打印任何内存地址时,为什么我会得到一个 <32 位的地址?
【发布时间】:2016-05-16 14:18:39
【问题描述】:

例如

printf("%u",&a);

给我输出

65524

这是一个 16 位地址。

【问题讨论】:

  • 不是每个人都可以坐在前排... ;-)
  • 0x0000000000000000 是 64 位地址,不是吗?它等于 0x0。
  • "如果我的电脑是 32 位系统,它有一个 32 位地址,对吗?"可能,但不能保证。 See this。此外,不能保证 unsigned int 将是 32 位。
  • 因此,如果您打印一个变量并获得值1,那将是一个 1 位变量吗?而7 的值是一个 3 位变量?否 - 您无法通过打印值来确定可用的位数。使用sizeof
  • 只是出于好奇:你的平台是什么?

标签: c pointers printf format-specifiers


【解决方案1】:

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

要打印指针,您应该使用%p 格式说明符并将参数转换为void*。类似的东西

 printf("%p",(void *)&a);

会做的。

也就是说,您应该首先研究virtual memory 的概念。

【讨论】:

  • @EugeneSh。正确的。太宽泛了,我已经添加了一个链接,希望对您有所帮助。 :)
【解决方案2】:

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

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

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

请看这个SO post

【讨论】:

    【解决方案3】:

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

    #include <stdint.h>
    #include <stdio.h>
    
    int main(void)
    {
      uintptr_t uip = (uintptr_t) -1;
      void * vp = (void*) uip;
    
      printf("%p\n", vp);
    }
    

    【讨论】:

      猜你喜欢
      • 2012-02-16
      • 2012-07-11
      • 2016-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-11
      • 2015-04-21
      • 2023-03-06
      相关资源
      最近更新 更多