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.