c memory-management realloc

¿Perdemos datos en un búfer después de la reasignación?



malloc c (2)

Nada se pierde Pero realmente debería probar si el realloc() (y el malloc() anterior) "funcionó".
Además, la conversión al valor de retorno de malloc es, en el mejor de los casos, redundante, y puede ocultar un error que el compilador hubiera detectado en su ausencia.

basado en el supuesto de que desea cadenas, su uso de strncpy es incorrecto

#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char *buffer = malloc(3); if (buffer == NULL) /* no memory */ exit(EXIT_FAILURE); strncpy(buffer, "AB", 2); /* ATTENTTION! ATTENTION: your array is not a string. ** buffer[2] is not the zero string terminator */ // buffer = realloc(buffer, 6); /* Will there be any lost here? */ /* If realloc returns NULL, you''ve just lost the only pointer to ** the allocalted memory, by overwriting it with NULL. ** Always `realloc` to a temporary variable */ char *tmp_buffer = realloc(buffer, 6); if (tmp_buffer == NULL) { /* realloc failed */ } else { /* realloc worked, no bytes lost */ buffer = tmp_buffer; /* ATTENTION! ATTENTION: buffer is still not a string ** buffer[0] is ''A'', buffer[1] is ''B'', ** all other elements of buffer are indeterminate */ } free(buffer); return(0); }

Estoy teniendo problemas para entender cómo funciona el realloc. Si maltraté un búfer y copié datos a ese búfer, digamos "AB":

+------------+ | A | B | /0 | +------------+

luego reasigné el búfer, ¿habrá alguna pérdida en los datos (incluso un solo byte) ?; ¿O simplemente expandiendo el búfer? :

+------------------------+ | A | B | /0 | ? | ? | ? | +------------------------+

código:

#include<stdio.h> #include<stdlib.h> #include<string.h> int main(void){ char* buffer = (char*) malloc( sizeof(char) * 3 ); strncpy(buffer, "AB", 2); buffer = (char*) realloc(buffer, sizeof(char) * 6); /* Will there be any lost here? */ free(buffer); return(0); }


Una realloc que aumenta el tamaño del bloque conservará el contenido del bloque de memoria original. Incluso si el bloque de memoria no se puede redimensionar, los datos antiguos se copiarán al nuevo bloque. Para una realloc que reduce el tamaño del bloque, los datos antiguos se truncarán.

Tenga en cuenta que su llamada a realloc significará que perderá sus datos si, por alguna razón, el realloc falla. Esto se debe a que realloc falla al devolver NULL , pero en ese caso el bloque de memoria original sigue siendo válido, pero ya no puede acceder a él, ya que ha sobrescrito el puntero, que será NULL .

El patrón estándar es:

newbuffer = realloc(buffer, newsize); if (newbuffer == NULL) { //handle error return ... } buffer = newbuffer;

Tenga en cuenta también que la conversión del valor de retorno de malloc es necesaria en C y que sizeof(char) es, por definición, igual a 1 .