5

我有一个结构定义为:

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 数组根本不占用任何空间?

4

3 回答 3

8

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

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

另外,为什么第二个变量根本不占用任何空间(似乎是这种情况)?

它是一个 C99 灵活的数组成员——这就是它的全部意义所在。这个想法是分配您的结构,例如:

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

然后你就会有一个结构,就像b一个 10 元素数组一样运行。

于 2013-08-17T15:15:32.037 回答
3

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

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

于 2013-08-17T15:16:28.607 回答
2

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

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

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

假设你的编译器支持它作为扩展,数组b[]的大小为零,这使得结构只包含一个char成员。填充规则struct起作用,将 填充struct到一个单词,在您的机器中是 4 个字节。

于 2013-08-17T15:30:51.393 回答