Перейдем к онлайн-стандарту C (черновик n1256) :
6.2.5 Типы
1 Значение сохраненного значенияв объекте или возвращаемом функцией определяется типом выражения, используемого для доступа к нему.(Идентификатор, объявленный как объект, является самым простым таким выражением; тип указан в объявлении идентификатора.) Типы разбиты на типы объектов (типы, которые полностью описывают объекты), функция типы (типы, которые описывают функции) и неполные типы (типы, которые описывают объекты, но не имеют информации, необходимой для определения их размеров).
Примеры неполные типы:
struct f; // introduces struct f tag, but no struct definition
int a[]; // introduces a as an array but with no defined size
Вы не можете создавать экземпляры неполных типов, но вы можете создавать указатели и имена typedef из неполных типов:
struct f *foo;
typedef struct f Ftype;
Чтобы включить неполныеТип структуры в тип объекта, мы должны определить структуру:
struct f
{
int x;
char *y;
};