c - sizeof(struct) 不遵循填充

标签 c struct structure sizeof

考虑一下,

#include<stdio.h>

struct outside1
{
    int a;
    char b;
    char c;
    char d[3];
};

struct outside2
{
    char a,b,A[2];
    char B[2];
};

int main()
{
    printf("%zu %zu\n",sizeof(struct outside1),sizeof(struct outside2));
    return 0;
}

通过使用填充概念预测输出,它将是“12 8”。但实际输出是“12 6”。

使用 gcc 4.7.2 Debian

谁能解释一下?

-新手

最佳答案

charint 几乎在任何实现中都有其自身大小的对齐要求。

sizeof(char) 每个标准为 1,int 的常见大小为 1、2 和 4。

这导致 outside1 的常见大小为 6、8、12。
对于 outside2 of 6.

顺便说一句:编译器被允许在每个结构成员之后插入任意数量的填充,尽管它通常使用最小必要量来解决对齐限制,以便轻松遵循“公共(public)初始子序列”规则。

此外,由于 C99 或相关版本的对齐方式仅限于 2 的幂,并且对象大小必须能被它整除。

关于c - sizeof(struct) 不遵循填充,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22972924/

相关文章:

c - 在结构中表示小值的最有效方法是什么?

c++ - 指向结构的指针如何工作?

c - 指向恒定大小的二维数组中的一维数组的指针

c - 使用 gcc,我无法获取第 3 方库 Cairo 来链接/编译

c - static size_t strnlen(const char *s, size_t max) -- 为什么是静态返回值?

c - 在结构中定义结构以及何时使用 union ?

c++ - 在结构中定义常量

c - 如何确定char指针数组元素的总字符长度?

c++ - 在 SWIG 中包装 C++ 结构模板

python - 使用 Cython 将结构从 C 返回到 Python