Ho letto che se si dichiara due le strutture come questa:Questo codice è garantito dallo standard C?
struct Node {
int a, b, c;
};
struct DerivedNode {
struct Node base;
int d, e, f;
};
Quindi è possibile utilizzare i puntatori a loro in questo modo:
struct DerivedNode myDerivedNode;
struct Node *regularNode = (struct Node *) &myDerivedNode;
regularNode->a = 3;
In altre parole, gli offset di indirizzo per a, b, c
sono gli stessi entro struct Node
e struct DerivedNode
. In questo modo è possibile ottenere una sorta di polimorfismo, in cui è possibile passare in modo forzato il puntatore DerivedNode (struct Node *)
ovunque venga normalmente utilizzato un puntatore del nodo.
La mia domanda è se questo comportamento è garantito. So che ci sono alcuni strani problemi di allineamento della memoria e che il compilatore a volte riordina i campi per ottenere un migliore riempimento in memoria. Il campo base
si troverà mai in un punto qualsiasi ma all'inizio di struct DerivedNode
?
Hai dimenticato la parola chiave 'struct' in diversi punti, no? –
@Jens Oh sì, probabilmente. Scusa –