EDIT: apparently some of this isn't allowed/has changed in various C standards. For my own hypothetical benefit, let's pretend we're using gcc test.c
with no standard or warning options.
In particular I'm looking at the under-the-hood specifics. I've added my current understanding. Am I right?
char **c1; //Size for a pointer is allocated on the stack. sizeof(c1) == sizeof(void*)
char *c2[0]; //Nothing is allocated on the stack. sizeof(c2) == 0
is there some other difference between these two cases I'm not aware of (besides sizeof)?
struct a {
int i;
char c[0]; //sizeof(a) is sizeof(int)? a.c == (&i)+1?
};
As I understand it, this is typically used for variable length arrays at the end of structures. But what about
struct b {
char *c[0] //sizeof(b) is 0? where does c point?
};
int j;
struct b myb; //myb.c == (&j)+1 == $esp?
Furthermore, how is the address of a zero length array known if space for its pointer is never allocated anywhere? I suppose the same way a regular array's address is known, but I'm struggling to wrap my mind around it at the moment.