dinamico dinamica cadena arreglo array c realloc

dinamica - ¿Realloc sobrescribe los viejos contenidos?



memcpy (4)

Aumenta la memoria ya asignada sin sobrescribir el contenido existente, o (si no puede crecer) asigna una nueva memoria más grande en una ubicación diferente y copia los contenidos existentes de la memoria anterior en la nueva memoria.

Cuando reasignamos la memoria a través de realloc() , ¿se realloc() los contenidos anteriores? Intento crear un programa que reasigne memoria cada vez que ingresemos datos en ella.

Por favor, dígame acerca de la asignación de memoria a través de realloc, ¿depende del compilador, por ejemplo?


Debería programar como si el puntero antiguo se hubiera sobrescrito, sí. La memoria antigua ya no está asignada, por lo que otra parte de su programa (o un subproceso del sistema, por ejemplo) puede volver a asignarla y escribirla en cualquier momento después de que llame a realloc.

Sin embargo, la nueva memoria siempre contendrá los mismos datos que estaban presentes en la memoria anterior (se copia para usted si es necesario), pero solo hasta el tamaño del bloque anterior, cualquier espacio adicional asignado al final quedará sin inicializar.

Si quieres una copia, haz un nuevo malloc y usa memcpy.

En cuanto a la implementación, cuando llama a realloc para aumentar el tamaño, puede suceder una de estas cosas:

  • Se asigna un nuevo bloque y se copian los contenidos de la memoria anterior, se libera el bloque anterior y se devuelve el nuevo puntero.
  • Si el área después del bloque no está asignada, el bloque existente puede extenderse y devolverse el mismo puntero.

Como no tiene forma de saber qué ha ocurrido, o incluso si se usa una implementación completamente diferente a la sugerida anteriormente, siempre debe codificar de acuerdo con la especificación de realloc, que es que ya no debe usar el puntero antiguo y debe usar el nuevo.


Es difícil saber lo que está preguntando, pero si está preguntando si puede leer los "contenidos antiguos" en la dirección antigua que se pasó a realloc , la respuesta es no . En algunos casos, puede encontrar parte o todos los contenidos antiguos allí, pero a menos que realloc devuelva el mismo puntero que le pasó, cualquier uso del puntero antiguo es un comportamiento indefinido .

Si simplemente pregunta si los contenidos antiguos se conservarán en la nueva dirección devuelta por realloc , la respuesta es sí (hasta el mínimo del tamaño anterior y el nuevo tamaño).


No te preocupes por los viejos contenidos.

La forma correcta de usar realloc es usar un puntero específico para la reasignación, probar ese puntero y, si todo funcionó bien, cambiar el puntero antiguo

int *oldpointer = malloc(100); /* ... */ int *newpointer = realloc(oldpointer, 1000); if (newpointer == NULL) { /* problems!!!! */ /* tell the user to stop playing DOOM and retry */ /* or free(oldpointer) and abort, or whatever */ } else { /* everything ok */ /* `newpointer` now points to a new memory block with the contents of oldpointer */ /* `oldpointer` points to an invalid address */ oldpointer = newpointer; /* oldpointer points to the correct address */ /* the contents at oldpointer have been copied while realloc did its thing */ /* if the new size is smaller than the old size, some data was lost */ } /* ... */ /* don''t forget to `free(oldpointer);` at some time */