我有一个结构定义为:
struct smth
{
char a;
int b[];
};
当我在此结构上调用sizeof
和offsetof
时:
cout << sizeof(struct smth) << endl;
cout << offsetof(struct smth, b) << endl;
输出是:
4
4
为什么当stuct的大小是4而char使用1个字节时,int数组的偏移量是4? 为什么会有某种填充? 另外,为什么int数组根本不占用任何空间?
答案 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
的大小为零,并且编译器在a
和b
成员之间添加填充,以便b
位于“单词”边界上
但是,如果我记得在这样的结构中正确拥有一个灵活的数组只有有效的C,而不是C ++,除了作为编译器扩展。
答案 2 :(得分:2)
由于OP评论问题是C ++:
struct smth
{
char a;
int b[];
};
像b[]
这样的数组在C ++中无效。数组必须具有固定大小。可变长度数组仅在C99中有效。
假设您的编译器支持它作为扩展,数组b[]
的大小为零,这使得struct只包含char
成员。 struct
中的填充规则有效,将struct
填充到一个字,即机器中的4个字节。