C/realloc
Esta función permite modificar dinamicamente o tamaño do espazo de memoria ao que sinala un punteiro, e crealo (é dicir, comportarse coma malloc()
) en caso de que o punteiro teña valor nulo.
Ao contrario que no caso de malloc()
, cando a realloc()
se lle pasa por vez primeira un punteiro ao que non se lle asignou ningún bloque de memoria aínda, hai que asegurarse de que o valor de dito punteiro sexa NULL
, para que a función saiba como ten que actuar. O máis doado é inicializar sempre os punteiros como NULL
. Se o bloque de memoria ao que apunta o punteiro xa existe (por exemplo, se o creamos mediante a función malloc()
previamente) non é necesario isto.
A súa sintaxe fundamental é a seguinte:
punteiro = (tipo da variable punteiro) realloc(punteiro, tamaño);
Esta sintaxe pode resultar algo complicada de comprender a primeira vista. Trátase de asignarlle a un punteiro un enderezo de memoria reservado pola función. Posto que realloc()
devolve en principio un punteiro de tipo void
(sen tipo), é preciso precisarlle á función un molde co tipo de punteiro correspondente ao punteiro que vai conter o enderezo do bloque de memoria reservado pola función. Asemade, a realloc()
hai que pasarlle como argumentos o punteiro que vai conter o enderezo do bloque de memoria e mailo tamaño en bytes que vai conter dito bloque.
A mellor forma de comprendelo quizais sexa un exemplo:
// Declaración do punteiro
unsigned short int * punteiro=NULL;
// Asignación de 10 celas “unsigned short int” en memoria dinámica
punteiro = (unsigned short int *) realloc(punteiro, 10*sizeof(unsigned short int));
Ao contrario que malloc()
, realloc()
permite modificar de xeito dinámico o tamaño do punteiro, é dicir, ademais de reservar un bloque de memoria cuxo tamaño se decide en tempo de execución, esta función permite aumentar e diminuír o tamaño de dito bloque durante a execución. Isto é, se temos un punteiro sinalando un bloque de memoria cun certo tamaño, mediante esta función amplíase (ou redúcese) o devandito bloque de memoria ao tamaño fornecido á función. En caso de que non caiba no bloque de memoria actual (porque a continuación na memoria hai algún outro dato gardado), realloc() busca un novo bloque de memoria libre, onde garda os datos do bloque de memoria actual e reserva o espazo adicional necesario para termos o tamaño especificado á función.
A memoria dinámica débese liberar antes de saír do programa mediante a función free()
, ou quedará reservada ata que se apague o computador onde se executou o programa.
Cadeas de caracteres
editarAo reservar espazo en memoria para unha cadea, cómpre lembrar que fai falla un carácter adicional para o \0
(carácter nulo) que sinala o fin da cadea.