Declaring zero size vector

后端 未结 4 933
萌比男神i
萌比男神i 2020-12-18 10:21

What does the following mean?

struct foo
{
...
char  bar[0];    // Zero size???
};

I asked my colleagues and they told me it\'s the same as

4条回答
  •  不思量自难忘°
    2020-12-18 10:35

    Your colleagues lied. (Probably not intentionally though so don't get mad at them or anything.)

    This is called a flexible array member, and in C99 is written as char bar[];, and in C89 was written as char bar[1];, and which some compilers would let you write as char bar[0];. Basically, you only use pointers to the structure, and allocate them all with an amount of extra space at the end:

    const size_t i = sizeof("Hello, world!");
    struct foo *p = malloc(offsetof(struct foo, bar) + i);
    memcpy(p->bar, "Hello, world!", i);
    // initialize other members of p
    printf("%s\n", p->bar);
    

    That way, p->bar stores a string whose size isn't limited by an array declaration, but which is still all done in the same allocation as the rest of the struct (rather than needing the member to be a char * and need two mallocs and two frees to set it up).

提交回复
热议问题