Код (Text): #include <stdio.h> typedef struct _a{ char d[2]; }*psa; int main(int argc, char* argv[]) { char a[10]={0}; psa b = (psa)a; printf("%p, %p, %p\n", &b->d, &b->d[0], b->d); return 0; } вывод: Код (Text): 0012FF74, 0012FF74, 0012FF74 Press any key to continue Вопрос: &b->d - как такая конструкция не вызывает ошибок, ведь d - это массив?
А почему она должна вызывать ошибку? Берется адрес члена структуры и передается в функцию printf. Компилятор не проверяет типы "непостоянных" аргументов функций с переменным числом параметров, это лежит на самой ф-ии. printf имеет прототип 'printf(const char *fmt, ...)', первый аргумент -- указатель на const char, остальные -- какие угодно и в каком угодно количестве.
int a[10]; &a; такой код вызовет ошибку. А если спрятать массив в структуре, почему ошибки не возникает.
На MS VS 6.0 Код (Text): int main(int argc, char **argv) { int a[10]; &a; return 0; } delme.exe - 0 error(s), 0 warning(s) все компилируется на ура.