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.

¿Cómo diferencia realloc de C entre un array de ints y un solo int?

Dado que los arrays son simplemente datos contiguos del mismo tipo, y no es necesario especificar explícitamente [] en algún lugar (por ejemplo, se puede hacer int *p1 = malloc(sizeof(int) * 4);), ¿cómo es que cuando haces realloc(p1, ...), sabe mover (si es necesario) exactamente el espacio equivalente a 4 enteros, incluso si potencialmente hay otros enteros en memoria?

Para aclarar la pregunta: si se asigna un array de esta manera, y también un único entero separado, ¿significa esto que estos 4+1 enteros totales nunca son contiguos en memoria, o esta información de “es un array” de alguna forma está presente en el bloque de memoria (por ejemplo, ¿tienen algún tipo de delimitador?), o el compilador lo infiere y lo recuerda a partir del parámetro de malloc? ¿O algo más?

Básicamente, ¿cómo se asegura de mover solo y exactamente esos 4 enteros, incluso cuando hay otros bloques de memoria del mismo tamaño que también podrían estar contiguos?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Cuando usas malloc para asignar memoria a un array, devuelve un puntero a un bloque de memoria contigua del tamaño que solicitaste. La ubicación exacta de ese bloque en la memoria es determinada por el sistema operativo y puede variar cada vez que asignas memoria. Sin embargo, el tamaño y la dirección de inicio del bloque se almacenan en los metadatos del montón (heap metadata), que son mantenidos por el asignador de memoria.

    Cuando llamas a realloc con un puntero a ese bloque de memoria, busca el tamaño y la dirección de inicio del bloque en los metadatos del montón. Si no hay suficiente espacio libre después del bloque para acomodar el nuevo tamaño solicitado, realloc moverá el bloque a una nueva ubicación en la memoria que tenga suficiente espacio. También actualizará los metadatos del montón para reflejar la nueva ubicación y tamaño del bloque.

    Por lo tanto, si asignas un array de esta manera y también un único entero separado, no significa que los enteros nunca sean contiguos en la memoria. Es posible que el asignador de memoria haya asignado el bloque para el array y el bloque para el entero uno al lado del otro en la memoria. Sin embargo, los bloques son tratados como separados por el asignador de memoria, y sus tamaños y ubicaciones son rastreados en los metadatos del montón.

    En resumen, realloc sabe exactamente cuánta memoria mover porque busca el tamaño y la dirección de inicio del bloque asignado en los metadatos del montón. Se asegura de mover solo y exactamente esos 4 bytes actualizando los metadatos del montón con la nueva ubicación y tamaño del bloque después de la operación de movimiento.

Comments are closed.