Search code examples
c++arrayssizeofoffsetof

Why is offsetof(member) equal to sizeof(struct)?


I have a struct defined as:

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

When I call sizeof and offsetof on this struct:

cout << sizeof(struct smth) << endl;
cout << offsetof(struct smth, b) << endl;

Output is:

4
4

How come when the size of the stuct is 4 and char is using 1 byte, the offset of the int array is 4? Why is there some kind of padding? Also, why isn't the int array occupying any space at all?


Solution

  • How come when the size of the stuct is 4 and char is using 1 byte, the offset of the int array is 4? Why is there some kind of padding?

    There is padding because the C standard allows it; the compiler often aligns variables to improve performance.

    Also, why isn't the second variable occupying any space at all (which seems like the case)?

    It's a C99 flexible array member - that's the entire point of it. The idea is to allocate your structure something like:

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

    And then you'd have a structure that operates as if b were a 10-element array.