为什么offsetof(member)等于sizeof(struct)?

bug*_*gra 5 c++ arrays sizeof offsetof

我有一个结构定义为:

struct smth
{
    char a;
    int b[];
};
Run Code Online (Sandbox Code Playgroud)

当我打电话sizeof,并offsetof在这个结构:

cout << sizeof(struct smth) << endl;
cout << offsetof(struct smth, b) << endl;
Run Code Online (Sandbox Code Playgroud)

输出是:

4
4
Run Code Online (Sandbox Code Playgroud)

为什么当stuct的大小是4而char使用1个字节时,int数组的偏移量是4?为什么会有某种填充?另外,为什么int数组根本不占用任何空间?

Car*_*rum 8

为什么当stuct的大小是4而char使用1个字节时,int数组的偏移量是4?为什么会有某种填充?

有填充因为C标准允许它; 编译器经常对齐变量以提高性能.

另外,为什么第二个变量根本不占用任何空间(看起来像这样)?

它是C99灵活的阵列成员 - 这就是它的全部要点.想法是分配你的结构,如:

struct smth *s = malloc(sizeof *s + 10 * sizeof s->b[0]);
Run Code Online (Sandbox Code Playgroud)

然后你会有一个像b10个元素阵列那样运行的结构.