Tamaño de la estructura que contiene dos punteros.

¿Cuál es el tamaño de esta estructura? (Cálculo del sistema de 32 bits. No de 64 bits.)

struct list_element { short data; struct list_element* next; struct list_element* prev; }; 

He intentado calcular el tamaño con estas fórmulas:

  1. (sizeof (list_element *) + sizeof (short)) + ((sizeof (list_element *) * 2)

    • (4 + 2) + (4 * 2) = 6 + 8 = 14
  2. (sizeof (short)) + (sizeof (list_element *) * 2)

    • 2 + (4 * 2) = 2 + 8 = 10
  3. (sizeof (list_element *) + sizeof (list_element *) + sizeof (short)) + (sizeof (list_element *) * 2)

    • (4 + 4 + 2) + (4 * 2) = 10 + 8 = 18
  4. (sizeof (list_element *) + sizeof (list_element *) + sizeof (short))

    • (4 + 4 + 2) = 10

Sin embargo, no devuelven la respuesta correcta. ¿Qué fórmula usas para calcular el tamaño de esta estructura?

Actualizar:

Mi maestro dice que estamos ignorando la alineación de datos … Esperemos que eso no desperdicie a nadie ya que se usa para manejar la alineación de datos con su código y estructuras …

Actualización 2 Gracias por la ayuda y la introducción a la alineación de datos.

La respuesta fue 10 sin alineación de datos … No estoy seguro de por qué tengo tanta prisa por trabajar con la alineación de datos en C … ¿Es divertido?

Además, la respuesta con alineación de datos es 12. Como ustedes explicaron, deben alinear los datos con el corto para que coincidan con los enteros. Por lo tanto, tiene (2 + (2 bytes adicionales)) + 4 + 4 = 12.

El tamaño de la estructura está dado por:

size_t size = sizeof(struct list_element);

El hecho de que tenga dos miembros que sean punteros a la estructura solo significa que está agregando el tamaño de un puntero, dos veces. En una comstackción de 32 bits, sizeof se resolvería en 4 bytes adicionales por puntero, en una comstackción de 64 bits, daría como resultado 8 bytes adicionales por puntero.

Otra cosa a tener en cuenta es que es probable que el tamaño de su estructura no sea simplemente la sum del tamaño de los miembros individuales, ya que el almacenamiento en una estructura a menudo se rellena con fines de alineación. Entonces, entre tu short y el siguiente miembro, el relleno resultará en un tamaño adicional.

La razón por la que usé la palabra probablemente es que si se usara una directiva de pragma pack en su fuente, la alineación del empaque podría cambiarse, dando como resultado un valor diferente para sizeof.

Dos buenas discusiones sobre el relleno de alineación de estructura: una discusión general aquí , y cómo reducir la huella de memoria aquí . El segundo enlace es particularmente interesante ya que trata con la alineación de la estructura, el relleno y los campos de bits, y cómo cada uno puede afectar el uso de la memoria.

Aunque su profesor pidió ignorar la alineación de los datos, el tamaño de esa estructura es de 10 bytes, asumiendo que el short es de 2 bytes … pero en realidad el tamaño short no es fijo, ¡pero al menos 2 bytes!

Dale un vistazo aquí . ¿Informaste correctamente la pregunta del profesor?

Esto devolverá el tamaño de la estructura:

 sizeof(struct list_element);