结构内变量的地址计算

时间:2016-03-21 13:49:11

标签: c pointers struct

这是我的代码。

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

struct test
{
  unsigned int x;
  long int y: 32;
  unsigned int z;
};

int main()
{
  struct test t;
  unsigned int *ptr1 = &t.x;
  unsigned int *ptr2 = &t.z;
  printf("ptr1 address is %p\n", ptr1);
  printf("ptr2 address is %p\n", ptr2);
  printf("size: %d", ptr2 - ptr1);
  return 0;
}

这是输出:

ptr1 address is 0028FEDC
ptr2 address is 0028FEE4
size: 2

我想我在输出的理解中忽略了一点。我期待输出为4.因为,long int在我的机器上占用了4个字节。而我正在得到x和z的地址之间的差异。然而,不是真正的输出,而不是通过手动减去x和z的地址获得的输出有任何意义。如果你看到上面的话,28FEE4-28FEDC = 8根据我的计算,但是输出是2.谁能告诉我我的计算错误在哪里?

1 个答案:

答案 0 :(得分:1)

要解释这种行为,你可以看看你的结构:

+---+---+---+
| x | y | z |
+---+---+---+
^       ^
|       |
&t.x    &t.z

&t.x&t.z之间的区别是两个元素,第一个来自&t.x&t.y,然后来自{{1}转到&t.y

应该注意,这只能 ,因为所有三种类型都是相同的大小,并且编译器没有在结构中添加任何填充。