【问题标题】:C how could an unsigned int only takes two bytes?C 一个无符号整数怎么可能只占用两个字节?
【发布时间】:2021-04-27 02:57:02
【问题描述】:

我正在玩指针,我注意到一件奇怪的事情。

我有一个结构如下:

typedef struct list_element_struct {
    uint32_t x; 
    uint32_t y; 
    uint32_t z; 
    struct list_element_struct *next; 
    }list_element;

据我所知,unsigned int 的大小是 4 个字节,指针的大小是 8 个字节。这里还有 8 个字节对齐,所以这个结构的大小是 24 个字节。

我已经使用list_element els[5]; 初始化了上述结构对象的列表,并且还使用memset(els,0,5*sizeof(list_element)); 将其中的每条数据设置为0

现在我正在尝试使用这些代码查看它们的内存位置:

printf("%p start location of els\n", &(els));
printf("%p start location of els->x\n", &(els->x));
printf("%p start location of els->y\n", &(els->y));
printf("%p start location of els->z\n", &(els->z));
printf("%p start location of els->next(pointer)\n", &(els->next));
printf("%p start location of els+1\n", &(els[1]));

我打印出来的是:

0x7ffeeba4a970 start location of els
0x7ffeeba4a970 start location of els->x
0x7ffeeba4a974 start location of els->y
0x7ffeeba4a978 start location of els->z
0x7ffeeba4a980 start location of els->next(pointer)
0x7ffeeba4a988 start location of els+1

这是奇怪的事情。为什么 els->z 只占用两个字节?它真的应该像 x 和 y 那样需要 4 个。

【问题讨论】:

  • sizeof(int) 必须至少是一个,这实际上是唯一的限制。它通常是 4,但不能保证。指针也是如此,只不过现在 8 也是常见的大小。
  • 看看0x7ffeeba4a988。有一些迹象表明数字多于 0-9 ;)
  • ...0x770x780x790x7a0x7b0x7c0x7d0x7d0x7e0x7fpan@98765433333336@pan >
  • "据我所知,unsigned int的大小是4个字节,指针的大小是8个字节。" --> 是众多可能性之一。

标签: c struct hex offset memory-address


【解决方案1】:

这些数字是十六进制的。 0x7ffeeba4a9780x7ffeeba4a980的区别不是2而是8。

为了防止您的下一个问题,它是 8 而不是 4 的原因可能是由于对齐要求。许多 64 位系统要么要求或倾向于将其 8 字节指针对齐到 8 字节边界,即对齐为 8 的倍数的地址(因此它们的最低有效十六进制数字是 80) .因此编译器在znext 之间留出4 个字节的填充来实现这一点。

【讨论】:

    【解决方案2】:

    地址显示为十六进制值

    0x7ffeeba4a978 start location of els->z
    0x7ffeeba4a980 start location of els->next(pointer)
    

    所以(考虑到最后两个十六进制数字)你有

      0x80
    -
      0x78
      ====
         8
    

    因为0x80 等于0x70 + 十进制16 或十六进制0x10

    十六进制数字按升序排列

    0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E, F and the next number is 0x10.
    

    编译器在数据成员z之后放置了一个等于4字节的填充用于对齐。

    【讨论】:

      猜你喜欢
      • 2015-02-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多