¿Es válido asignar memoria a un puntero de una estructura sin conocer el tamaño de sus subestructuras?
Considere el siguiente código:
#include<stdio.h>
struct word {
char* data;
};
struct sentence {
struct word* data;
int word_count;
};
struct paragraph {
struct sentence* data;
int sentence_count;
};
struct document {
struct paragraph* data;
int paragraph_count;
};
void main()
{
int total_paragraph = 5; //Estoy asignando el número total de párrafos por simplicidad
struct document doc;
doc.data = malloc(total_paragraph*(sizeof(struct paragraph))); //¡Esta es la declaración en la que tengo dudas!
....
....
....
}
En primer lugar, lógicamente, ¿es válida la declaración (malloc) en la que tengo dudas?
Si es así, ¿cómo asigna la computadora 5 unidades de memoria (cada unidad tiene el tamaño de struct paragraph) sin conocer el tamaño de struct paragraph (ya que no hemos asignado memoria para su contenido, el puntero data que apunta a un tipo struct sentence)?</stdio.h>
davy.ai
Sí, la declaración es lógicamente válida. Asigna memoria de forma dinámica para un array de 5 instancias de
struct paragraph
.Cuando se llama a
malloc
con un tamaño dado, asigna esa cantidad de memoria desde el montón (heap) y devuelve un puntero al primer byte de ese bloque de memoria. En este caso,total_paragraph*(sizeof(struct paragraph))
calcula el tamaño total necesario para 5 instancias destruct paragraph
y pasa ese tamaño amalloc
. El sistema operativo luego proporciona un bloque de memoria contiguo de ese tamaño, que se asigna al campodata
de la variabledoc
.Aunque el tamaño de los tipos de struct anidados (por ejemplo,
struct sentence
) no es conocido explícitamente pormalloc
, aún asigna únicamente el espacio necesario para las instancias destruct paragraph
en sí mismas, no para ninguno de sus contenidos. Depende del programa asignar memoria para las structs anidadas y asignar esos punteros a los camposdata
relevantes.