3
struct xyz {
    int a;
    int b;
    char c[0];
};
struct xyz x1;
printf("Size of structure is %d",sizeof(x1));

输出:8 为什么结构体的大小不是 9 字节?是因为声明的字符数组的大小为0吗?

4

4 回答 4

5

零长度数组不在标准 C 中,但许多编译器都允许使用它们。

这个想法是它们必须作为结构中的最后一个字段放置,但它们不占用任何字节。该结构用作在内存中紧挨着它放置的数组的标头。

例如:

struct Hdr
{
    int a, b, c;
    struct Foo foos[0]
};

struct Hdr *buffer = malloc(sizeof(struct Hdr) + 10*sizeof(Foo));
buffer->a = ...;
buffer->foos[0] = ...;
buffer->foos[9] = ...;

执行此操作的标准方法是创建一个大小为 1 的数组,然后从数组的长度中减去该 1。但即使是这种技术也是有争议的......

有关更多详细信息和类似的灵活数组成员,请参阅此文档

于 2013-08-08T21:42:13.183 回答
3

您的字符数组的长度为 0,因此 c 的大小为 0 字节。因此,当您的编译器为该结构分配一块内存时,它只考虑两个整数,并且由于您处于 32 位环境(从您的结果中假设),结构的大小为 8 个字节。

备注:您仍然可以在没有任何编译器警告(使用 gcc 编译)的情况下访问字段 c,但它会是一些垃圾值。

于 2013-08-08T21:35:04.360 回答
0

标准 C 中实际上不允许长度为 0 的数组,但显然您的编译器支持它作为扩展。

这是实现所谓的“struct hack”的一种方式,在comp.lang.c FAQ的问题 2.6 中有解释。

因为 C 实现通常不对数组进行边界检查,所以零元素数组(或者在更便携的变体中,单元素数组)为您提供了任意大小数组的基地址。您必须为封闭结构分配(通常使用malloc)足够的内存,以便为您需要的任意数量的数组元素留出空间:

struct xyz *ptr = malloc(sizeof *ptr + COUNT * sizeof (char));

C99 添加了一个新功能“灵活数组成员”,它可以在不指定假数组大小的情况下执行相同的操作:

 struct xyz {
     int a;
     int b;
     char c[];
 };
于 2013-08-08T21:42:18.640 回答
0

在这种情况下:

int a;//4

int b;//4

char c[0] ; 0

所以是8。

并且 sizeof 永远不会在你的结构中返回 9,即使你给 char c[]; 一个大小。

int a;//4  byte
int b;//4   byte
char c[1];// one byte but it should alignment with other. 

就这样:

^^^^
^^^^
^~~~     //for alignment

所以,sizeof 返回 12 而不是 9

于 2013-08-08T21:40:28.673 回答