Это правда, что адрес структуры совпадает с адресом ее первого члена. Тем не менее, они имеют различные типы . Один имеет тип struct animal *
, а другой - struct base *
.
В этом случае вам разрешено конвертировать между ними, однако для этого вам нужно явное приведение.
display((struct animal *)BASE(peacockptr));
Также относительно того, как вы определили свой макрос BASE
:
#define BASE(class) *(&class)
Операторы *
и &
взаимно отменяют друг друга, так что это, по сути, запрет. BASE(peacockptr)
эквивалентно peacockptr
.
Причина, по которой вам сейчас не удается выполнить приведение, состоит в том, что вы peacockptr
определены как экземпляр и pecock
как указатель , т.е. вы перепутали себя с наименование Переключите имена, чтобы отразить использование:
struct bird peacock;
struct animal base;
base.hear=1;
base.walk=1;
peacock.base= &base;
struct bird *peacockptr =&peacock;
peacockptr->fly=1;