Гарантирован ли этот код стандартом C?

Я читал, что если вы объявите две структуры следующим образом:

struct Node {
   int a, b, c;
};

struct DerivedNode {
   struct Node base;
   int d, e, f;
};

Тогда вы можете использовать указатели на них следующим образом:

struct DerivedNode myDerivedNode; 
struct Node *regularNode = (struct Node *) &myDerivedNode;

regularNode->a = 3;

Другими словами, смещения адресов для a, b, c одинаковы внутри struct Node и struct DerivedNode. Таким образом, вы можете получить своего рода полиморфизм, когда вы можете передать принудительно (struct Node *)-cast DerivedNode указатель везде, где обычно берется указатель Node.

Мой вопрос в том, гарантировано ли такое поведение. Я знаю, что существуют некоторые странные проблемы с выравниванием памяти и что компилятор иногда изменяет порядок полей, чтобы добиться лучшей упаковки в памяти. Будет ли поле base когда-либо располагаться где-либо, кроме начала struct DerivedNode?

7
задан Blagovest Buyukliev 11 October 2011 в 11:53
поделиться