c sizeof 整数对齐方式?

标签 c sizeof

嗨,我知道 C 标准在执行 sizeof 时需要内存对齐。但我不太明白为什么即使是整数数组也需要对齐。请参阅我的以下示例:

#include <stdio.h>

struct flexarray {
    int a[2];
    double f;
};

int main(int argc, char** argv)
{
    printf("sizeof (struct flexarray) = %zu\n", sizeof (struct flexarray));
    return 0;
}

输出为 16,因为 sizeof(int) = 4 且 sizeof(double) = 8。这很好。

但是当我将 a 更改为 int[3] 时,输出是 24 这不是我所期望的,因为根据我的计算结果应该是 20 (= 3 x 4 + 8)。

我能想到的唯一解释是编译器添加了一个填充整数,但我不明白为什么会发生这种情况:sizeof(int[3]) 是 12,它是 4 的倍数毕竟字节。

我正在使用 gcc 在 32 位 Linux 上进行编译。

Linux 93c9e1096795 3.10.0-327.10.1.el7.x86_64 #1 SMP Tue Feb 16 17:03:50 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

谁能告诉我为什么?

最佳答案

如果您使用 offsetof 检查类成员的位置,您可能会发现编译器希望 double 值在 8 字节边界上对齐。

关于c sizeof 整数对齐方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37934464/

相关文章:

c - C中的逻辑数组

c - 如何使用 verilog PLI 通过 ncverilog 编译器与 c 通信

c++ - 适用于 x86 的 OpenSolaris 的良好 C/C++ 编译器

java - 尝试将 TCHAR 类型发送到接受字符串作为参数的 java 函数时,jvm 崩溃

c - 与负数比较时,为什么 sizeof 运算符会发生这种情况?

c++ - 为什么 sizeof ("string") 打印的长度比 "string"的长度多 1 ?

c - 指向 NULL 的指针的 Sizeof()

c - sizeof 作为字符串维度的段错误

c - OpenSSL 使失败 "error: x86_64: No such file or directory"

c++ - 为什么 std::string 上的 Sizeof 运算符会产生意外结果?