gpt4 book ai didi

c - 位域未在字节边界对齐的结构的大小

转载 作者:太空宇宙 更新时间:2023-11-04 05:49:49 25 4
gpt4 key购买 nike

这是我的程序

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

int main() {
struct bitfield {
unsigned a:3;
char b;
unsigned c:5;
int d;
}bit;

printf("%lu \n",sizeof(bit));
return 0;
}

我原以为这个结构的大小相当大,但在我的机器上结果是 8,因为无符号是 4 个字节。现在我期望比这更多的原因是因为我希望 char b 位于字节边界上,以便它在内存中正确对齐。现在我的猜测是编译器将 a、b、c 全部放在这 4 个字节中。我是 C 的新手,所以请多多包涵。我假设除了位字段之外的所有其他数据类型都必须是字节不正确的吗?如果它是正确的,我希望 a 获取整个 unsigned int,而 b 获取一个字节,然后填充 3 个字节,然后依此类推。我在这里缺少什么?

最佳答案

我好像没看懂这个冲突。

你基本上有:

struct bitfield {
unsigned a:3;
unsigned padding1:5;
char b;
unsigned c:5;
unsigned padding2:3;
unsigned padding3:8;
int d;
}bit;

a 在字节 1 边界上,它使用 3 位 + 5 位填充(因为没有更多的位字段来用完剩余的位)。

b 在字节 2 边界上,它使用一个完整的字节。

c 在字节 3 边界上,它使用 5 位 + 3 位填充(因为没有更多的位字段来用完剩余的位)。

- int padding comes here -

d 位于 int 边界(在您的机器上为 4 个字节)。它使用 1 个字节用于填充 + 4 个字节用于数据。

一共8个字节...

...虽然,正如@JonathanLeffler 在评论中指出的那样,这是特定于实现的,并不意味着每个编译器的行为都相同。

关于c - 位域未在字节边界对齐的结构的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45403919/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com