EDIT: видимо, некоторые из них не разрешены/изменены в разных стандартах C. Для моей собственной гипотетической выгоды, пусть притворяется, что мы используем gcc test.c
без стандартных или предупреждающих опций.
В частности, я смотрю на особенности нижнего капота. Я добавил свое понимание. Я прав?
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
Есть ли другая разница между этими двумя случаями, о которых я не знаю (помимо sizeof)?
struct a {
int i;
char c[0]; //sizeof(a) is sizeof(int)? a.c == (&i)+1?
};
Как я понимаю, это обычно используется для массивов переменной длины в конце структур. Но как насчет
struct b {
char *c[0] //sizeof(b) is 0? where does c point?
};
int j;
struct b myb; //myb.c == (&j)+1 == $esp?
Кроме того, как известен адрес массива нулевой длины, если пространство для его указателя никогда не выделяется нигде? Я предполагаю, что так же известен обычный адрес массива, но я изо всех сил стараюсь обмануть его в данный момент.