编译器是否始终将结构放置在对齐的地址处?

ary*_*rye 2 c struct memory-alignment

假设我有结构:

typedef struct my_char {
    char c;
} my_char_t;
Run Code Online (Sandbox Code Playgroud)

我可以假设任何时候内存地址都会对齐吗?

我想也许是的,因为在教程中我看到了这样的结构:

typedef struct my_char2 {
    char c;
    int i;
} my_char2_t;
Run Code Online (Sandbox Code Playgroud)

c和之间有填充i,因此看起来假设c是对齐的。

Eri*_*hil 6

通过普通方式(例如通过使用定义对象的声明或通过使用malloc分配空间)在 C 中创建的任何对象都将具有 C 实现对该对象所需的对齐方式。

的对齐要求struct my_char { char c; }通常只是一个字节,因为该结构只包含一个具有一字节对齐要求的成员。结构的对齐要求通常是其成员中最严格的对齐要求,因此struct { char c; }具有一字节要求,并且struct { char c; int i; }具有与 an 相同的对齐要求int,在现代 C 实现中通常为四个字节。