这是我的代码。
#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.谁能告诉我我的计算错误在哪里?
答案 0 :(得分:1)
要解释这种行为,你可以看看你的结构:
+---+---+---+ | x | y | z | +---+---+---+ ^ ^ | | &t.x &t.z
&t.x
和&t.z
之间的区别是两个元素,第一个来自&t.x
到&t.y
,然后来自{{1}转到&t.y
。
应该注意,这只能 ,因为所有三种类型都是相同的大小,并且编译器没有在结构中添加任何填充。