Хотя они выглядят одинакового типа (и в этом простом случае идентичны), они считаются компилятором разных типов.Это имеет смысл для более сложных случаев или в C ++, где система типов более сложна, чем в чистом C.
Как правило, вы не должны полагаться на хитрости компилятора или хакерство для выполнения такого рода назначения.Вместо этого сделайте это правильно.Либо непосредственно присваивайте поля, либо, чтобы упростить код, создайте вспомогательную функцию по следующим направлениям:
void ASetBWithC(A *a, C c) {
assert(a != NULL);
a->b.a = c.a;
}
C ++ также имеет оператор присваивания, который вы можете перегрузить, чтобы выполнять свою работу за вас (вместо создания именованного помощникафункция), но я подозреваю, что это выше вашего текущего уровня комфорта.