es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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>

Tags:  , , ,

Answer

  1. Avatar for 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 de struct paragraph y pasa ese tamaño a malloc. El sistema operativo luego proporciona un bloque de memoria contiguo de ese tamaño, que se asigna al campo data de la variable doc.

    Aunque el tamaño de los tipos de struct anidados (por ejemplo, struct sentence) no es conocido explícitamente por malloc, aún asigna únicamente el espacio necesario para las instancias de struct 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 campos data relevantes.

Comments are closed.