Dynamic memory: malloc, free, and realloc · Memoria dinámica: malloc, free y realloc
Memoria de pila vs memoria del montón
- Las variables locales normales viven en la pila. Aparecen cuando una función comienza y desaparecen cuando esta termina.
- A veces necesitas memoria que sobreviva a la función, o cuyo tamaño solo conoces en tiempo de ejecución.
- Esa memoria proviene del montón. La solicitas y, más tarde, la devuelves.
malloc y sizeof
mallocsolicita al montón un bloque de bytes y devuelve un puntero hacia él.- Usa
sizeofpara obtener el tamaño de un elemento:malloc(n * sizeof(int))hace espacio paranenteros. - El bloque es tuyo para usarlo a través del puntero, exactamente como un array:
a[0],a[1], ...
free y fugas de memoria
- Cuando termines con la memoria del montón, devuélvela con
free(pointer). - Si nunca llamas a
free, el programa fuga memoria — mantiene espacio que ya no utiliza. - Regla para estas tareas: tu función asigna y devuelve; el verificador la libera. No llames a
freetú mismo.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *a = malloc(3 * sizeof(int)); // room for 3 ints
a[0] = 5; a[1] = 6; a[2] = 7;
printf("%d\n", a[0] + a[1] + a[2]); // 18
free(a); // give it back
return 0;
}
Crecer un array con realloc
realloc(a, newSize)redimensiona un bloque del montón, conservando el contenido anterior.- Puede mover el bloque, así que siempre usa su valor de retorno:
a = realloc(a, ...). - Esta es la forma de crecer un array elemento por elemento, como una lista que se alarga.
Errores comunes
- Cada
mallocnecesita unfreecorrespondiente; no uses la memoria después de llamar afree. - Verifica que
mallocno haya devueltoNULL.
Ahora te toca a ti
- Usa
malloc(n * sizeof(int))para nuevos arrays, y#include <stdlib.h>. - Tu función devuelve el puntero; el verificador lo libera — no llames a
free. No escribas unmain.
Complete int *make_array(int n, int value) so it allocates n ints (with malloc), sets every one to value, and returns the pointer. The checker frees it. Do not · no write a main. · Completa int *make_array(int n, int value) para que asigne n ints (con malloc), establezca cada uno a value, y devuelva el puntero. El verificador lo liberará. No escribas un main.
Click Run to see the output here. · Haz clic en Ejecutar para ver la salida aquí.
Complete int *concat(const int a[], int na, const int b[], int nb) so it allocates na + nb ints, copies all of a then all of b, and returns the pointer. The checker frees it. Do not · no write a main. · Completa int *concat(const int a[], int na, const int b[], int nb) para que asigne na + nb ints, copie todos los de a seguidos de todos los de b, y devuelva el puntero. El verificador lo liberará. No escribas un main.
Click Run to see the output here. · Haz clic en Ejecutar para ver la salida aquí.
Complete int *push(int *a, int *len, int value) so it grows the heap array a to hold one more int with realloc, stores value at the end, increases *len by 1, and returns the new pointer. The checker frees it. Do not · no write a main. · Completa int *push(int *a, int *len, int value) para que expanda el array en heap a para contener un int más con realloc, almacene value al final, aumente *len en 1, y devuelva el nuevo puntero. El verificador lo liberará. No escribas un main.
Click Run to see the output here. · Haz clic en Ejecutar para ver la salida aquí.