El documento habla sobre la memoria dinámica y cómo se puede asignar y liberar memoria en tiempo de ejecución usando funciones como malloc, calloc, realloc y free. Explica que malloc asigna memoria sin inicializarla, calloc asigna memoria inicializada en cero, y realloc permite reasignar la memoria potencialmente pidiendo más. También cubre cómo se puede usar estas funciones para pedir memoria para arreglos y matrices de tamaños dinámicos.
2. Reflexiones Preliminares
Hasta ahora trabajamos con variables cuyo
tamaño en memoria conocemos:
Char → 1 byte
Int → 4 bytes
Float → 4 bytes
Double → 8 bytes
Int arr[20] → ? bytes
3. Reflexiones Preliminares
¿En todo programa conocemos TODA la
información que vamos a necesitar
de antemano?
¿Hay ejemplos en donde esto no ocurra?
4. Reflexiones Preliminares
Sí.
Ejemplo: Encontrar el máximo número dentro de
un conjunto de números ingresado por el usuario.
A priori no sabemos cuántos números deseará
ingresar por lo que ello se decidirá dinámicamente
en tiempo de ejecución.
8. malloc: Aridad
void* malloc(cantBytes)
Se le piden cantBytes al SO. Devuelve un puntero
a donde comienza dicha memoria o NULL sino.
Nota: Debo castear void al tipo de datos al que va
a apuntar el puntero.
12. malloc: Ejemplo
Bueno, ahora sí, eso es todo... ¿No?
Claramente no.
Cuando no uso más esa memoria obtenida
dinámicamente, debo “devolverla” pues la “pedí
prestada”.
14. Matrices
¡Arreglo de arreglos!
Cada uno puede tener distinto tamaño.
Luego, más general que una matriz aún.
Debo pedir memoria para el arreglo de arreglos y
para cada uno de esos arreglos.
15. Matrices: Pido Memoria
int filas, cols;
scanf("%d %d",&filas, &cols);
int** arr;
arr = (int**) malloc(filas*sizeof(int*));
//Chequeo si arr==NULL
int i;
for(i=0; i<filas; i++){
arr[i] = (int*)
malloc(cols*sizeof(int));
//Chequeo si arr[i]==NULL
}
17. miniEjercicio
Hallar la traspuesta de una matriz ingresada por
el usuario desde el teclado y guardarla en un
archivo de texto. ¿Cómo la guardarían?
Nota: traspuesta(A)ij = Aji donde A es de nxm y A
traspuesta es de mxn
18. calloc: Clear Allocation
void* calloc(cantElems, bytesElem)
Reserva memoria para cantElems de tamaño
bytesElem, es decir, cantElems*bytesElem bytes
de memoria. Sino, devuelve NULL.
19. malloc vs calloc
malloc no inicializa la memoria.
calloc pone un 0 en cada elemento del array.
Luego, calloc es más costosa temporalmente ya
que debe recorrer todo el arreglo y ponerle 0's.
22. Resumen
malloc para pedir memoria.
calloc para pedir memoria inicializada en 0.
realloc para reasignar memoria (potencialmente
pidiendo más).
free para liberar memoria después de su uso.