РЕДАКТИРОВАТЬ: очевидно, что это не разрешено / изменилось в различных стандартах 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?
Кроме того, как узнать адрес массива нулевой длины, если место для его указателя нигде не выделено? Я полагаю, что точно так же известен адрес обычного массива, но сейчас я пытаюсь обдумать его.