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

时间:2013-08-17 15:13:39

标签: c++ arrays sizeof offsetof

我有一个结构定义为:

struct smth
{
    char a;
    int b[];
};

当我在此结构上调用sizeofoffsetof时:

cout << sizeof(struct smth) << endl;
cout << offsetof(struct smth, b) << endl;

输出是:

4
4

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

3 个答案:

答案 0 :(得分:8)

  

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

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

  

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

这是一个C99灵活的阵列成员 - 这就是它的全部要点。我们的想法是为您的结构分配如下内容:

struct smth *s = malloc(sizeof *s + 10 * sizeof s->b[0]);

然后你有一个结构,就像b是一个10元素阵列一样。

答案 1 :(得分:3)

因为成员b的大小为零,并且编译器在ab成员之间添加填充,以便b位于“单词”边界上

但是,如果我记得在这样的结构中正确拥有一个灵活的数组只有有效的C,而不是C ++,除了作为编译器扩展。

答案 2 :(得分:2)

由于OP评论问题是C ++:

struct smth
{
    char a;
    int b[];
};

b[]这样的数组在C ++中无效。数组必须具有固定大小。可变长度数组仅在C99中有效。

假设您的编译器支持它作为扩展,数组b[]的大小为零,这使得struct只包含char成员。 struct中的填充规则有效,将struct填充到一个字,即机器中的4个字节。