编码
#include <stdio.h>
struct test {
unsigned int x; // consider int as 4 bytes
long int y : 33; // consider long as 8 bytes
unsigned int z;
};
int main()
{
struct test t;
unsigned int* ptr1 = &t.x;
// long int* ptr3 = &t.y;
unsigned int* ptr2 = &t.z;
printf("sizeof(struct test) %lu\n", sizeof(struct test));
printf("&t.x %u\n", ptr1);
printf("&t.z %u\n", ptr2);
printf("ptr2 - ptr1 %ld\n", ptr2 - ptr1);
return 0;
}
输出量:
我还以为
- 4个字节分配给x
- 因为long int是位字段的,所以分配给它的是33位-〉4 + 4字节,但只使用了33位
- 然后将4个字节分配给z,并且不占用前8个字节中的剩余空间,因为没有剩下4个完整的字节。
总共16个字节,不知何故它是24
这是怎么回事?
同样,由于顺序在位域中很重要,如果x从3187370912开始,因为它不是位域,它得到4个字节。long int得到8个字节,即使只使用了33位,因为下一个域不是位域,所以它需要额外的4个字节。所以x和z之间的ptr应该有4+8 = 12个字节的差异。但输出是4个字节。
这是怎么回事?
1条答案
按热度按时间jqjz2hbq1#
在printf的这些调用中
使用了错误转换说明符您需要编写
对于你的问题,编译器会根据
sizeof( long int )
的值对齐该结构,以保证数据成员y
会根据其类型对齐。因此,编译器在变量x
之后放置了4
填充字节。作为指针ptr2
和ptr1
之间的结果(在z
和x
数据成员的地址之间)类型为int *
的字节数为16
。因此,使用指针算法,printf的最后一次调用输出值4
,因为sizeof( int )
等于4
。此位字段
放置在
long int
类型的一个对象中。