He leído que si se declara dos estructuras de esta manera:¿Este código está garantizado por el estándar C?
struct Node {
int a, b, c;
};
struct DerivedNode {
struct Node base;
int d, e, f;
};
continuación, puede utilizar punteros a ellos de esta manera:
struct DerivedNode myDerivedNode;
struct Node *regularNode = (struct Node *) &myDerivedNode;
regularNode->a = 3;
En otras palabras, los desplazamientos de dirección para a, b, c
son los mismos dentro de struct Node
y struct DerivedNode
. Para que pueda obtener un tipo de polimorfismo, donde puede pasar por la fuerza (struct Node *)
-cast DerivedNode puntero siempre que un puntero de nodo normalmente se tomaría.
Mi pregunta es si este comportamiento es garantizado. Sé que hay algunos problemas de alineación de memoria extraños y que el compilador a veces reordena los campos para lograr un mejor empaque en la memoria. ¿Encontrará el campo base
en algún lugar excepto el comienzo de struct DerivedNode
?
Olvidó la palabra clave 'struct' en varios lugares, ¿no? –
@Jens Oh sí, probablemente. Lo siento –