gpt4 book ai didi

c - 包含 char 的 C 结构的大小

转载 作者:行者123 更新时间:2023-12-02 20:21:23 24 4
gpt4 key购买 nike

我在C语言中定义了2个结构体,都包含2个int和1个char。当我打印它们的尺寸时,它给出的结果我无法证明。这是我的代码:

#include<stdio.h>
struct sample
{
int a:6;
int b:12;
char s;
} st;
struct name
{
int a:28;
int b:12;
char ch;
} st1;

int main()
{
int i=sizeof(st);
printf("st : %d\n\n",i);

i=sizeof(st1);
printf("st1 : %d\n\n",i);
}

输出是:

st : 4
st1 : 8

为什么st的大小是4字节而st1的大小是8字节?

我找到了这个similar question但我得到的值仍然不合理。根据这个问题,我的结构 st 应该占用 3 个字节,st1 应该占用 6 个字节。

最佳答案

典型的编译器将从结构成员中最严格的对齐要求来确定结构对齐要求。在此过程中,位字段通常被视为普通字段。

这意味着,由于您的第一个结构包含 int 类型的成员(显然,其对齐要求为 4),因此整个结构的对齐要求为 4,并且其大小将始终为能被 4 整除。4 是它可能具有的最小尺寸。由于位字段仅使用 18 位(至少 3 个字节),因此编译器设法将所有内容打包为 4 个字节。但它不能使其小于 4。

(请注意,顺便说一句,仅通过计算所需的位数即可得出总共 26 个字节。即使忽略任何对齐注意事项,我也不清楚您究竟如何期望它适合 3 个字节。)

在第二个结构中,您使用了 40 位作为位字段(已经涉及 5 个字节)。现在编译器无法将所有内容打包到 4 个字节中,因此它使用 8 个字节。同样,结构体大小必须能被 4 整除,这意味着如果 4 不够,那么下一个最小的大小是 8。

如果您想覆盖该对齐行为,则必须使用特定于编译器的功能来强制对所有数据类型(#pragma pack 等)进行 1 字节对齐。这样您就可以减少第二个结构的大小。但您现在观察到的情况在默认对齐设置下完全符合预期。

关于c - 包含 char 的 C 结构的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25330899/

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