The difference between A
and B
is that the second one is illegal. Array declarations that specify 0
as the size are always unconditionally illegal in standard C. If your compiler accepts this declaration, it is a non-standard extension of your compiler.
Meanwhile, the array declaration in A
is a C99 feature that declares a flexible array member at the end of the struct.
The declaration inside C
is a pointer declaration. A
and B
declare array members, C
declares a pointer member. So, that's your difference.
P.S. If your compiler accepts the definition of B
, then it is indeed likely to be the same as the definition of A
.