Search code examples
cstructure

zero length arrays


Recently I came across a structure definition,

struct arr {
    int cnt;
    struct {
        int  size;
        int *name;
    } list[0];
};

and now I don't know the reason for list[0] being declared. What I am interested in is why is this used. Does it have any advantage? If yes, what is it?


Solution

  • The use is for dynamic-length arrays. You can allocate the memory using malloc(), and have the array reside at the end of the structure:

    struct arr *my_arr = malloc(sizeof *my_arr + 17 * sizeof *my_arr->list);
    my_arr->cnt = 17;
    my_arr->list[0].size = 0;
    my_arr->list[1].name = "foo";
    

    Actually being able to use 0 for the length is (as pointed out in a comment) a GCC extension. In C99, you can leave out the size literal altogether for the same effect.

    Before these things were implemented, you often saw this done with a length of 1, but that complicates the allocation a bit since you must compensate when computing the memory needed.