mar*_*nio 4 c gcc sizeof c99 flexible-array-member
我对sizeof()C语言的输出感到困惑。说我有:
struct foo {
char a;
char b;
char c;
char d[0];
};
Run Code Online (Sandbox Code Playgroud)
我希望sizeof(struct foo)是4。但是,用gcc编译后返回3。另外,在使用严格的设置编译代码时-pedantic-errors,会出现编译器错误。
有人可以帮助我了解这种行为吗?
数组大小为0不合法。C标准中有关数组声明符的第6.7.6.2p1节规定:
除可选的类型限定符和关键字static外,
[和]还可以分隔表达式或*。如果它们定界表达式(指定数组的大小),则该表达式应具有整数类型。如果表达式是一个常量表达式,则其值应大于零。 元素类型不得为不完整或函数类型。可选类型限定符和关键字static必须仅出现在具有数组类型的函数参数的声明中,然后仅出现在最外面的数组类型派生中。
因此,因为这违反了约束,所以此定义调用未定义的行为。
话虽如此,一些编译器允许零长度数组作为struct扩展的最后一个成员。 GCC做到了。在这种情况下,它的作用与灵活数组成员相同。
执行此操作的标准方式是将尺寸留为空白:
struct foo {
char a;
char b;
char c;
char d[];
};
Run Code Online (Sandbox Code Playgroud)
在这两种情况下,结构体的大小均不包含柔性数组成员,这就是为什么大小为3而不是4的原因(尽管结构中是否存在填充取决于实现)。这也意味着这样的结构不能成为数组的成员(至少在没有一些麻烦的手动指针操作的情况下)。
使用这种结构的方法是为其动态分配空间以及最后一个成员的许多元素。例如:
struct foo *my_foo = malloc(sizeof(*my_foo) + (sizeof(char) * number_of_elements));
Run Code Online (Sandbox Code Playgroud)