Intro MemDin
Áreas de Memoria: Estática vs Dinámica¶

Gestión memoria dinámica en C¶
Llamadas al sistema
Las llamadas a la librería del sistema más relevantes para este apartado del curso se declaran en stdlib.h:
- void *calloc(int num, int tam): Asigna memoria para acomodar num elementos de tamaño tam bytes. La memoria asignada se devuelve inicializada
- void free(void * puntero): Permite liberar un bloque de memoria previamente asignada y referenciada por puntero
- void *malloc(int num): Asigna un bloque de num bytes y, OJO, no inicializa. O sea, si reutiliza memoria permanecerá el contenido que hubiera en ella. Por ello, se recomienda siempre inicializar (ver memset())
- void *realloc(void * puntero, int ntam): Reasigna la memoria previamente asignada y referenciada por puntero a ntam bytes
El casting en C¶
C es un lenguaje fuertemente tipeado lo cual significa que todo tiene un tipo asignado. Entonces, puesto que cada tipo requiere un consumo de memoria particular habría que escribir funciones de asignación de memoria específicas para reservar y liberar memoria de cada tipo de datos. Para evitar esto (y por otras razones que no vienen al caso), las funciones que asignan memoria devuelven un puntero a void. Esto es, la definición de un puntero genérico que procede especificar al tipo de que se trata
En tal caso, el casting soporta la especificación o concreción de dicho puntero. Básicamente consiste en una conversión explícita de tipo análoga a la de cualquier otro tipo básico
Ejemplo:¶
arr2 = (char *) realloc( arr2, lstr + 1 );
El operador sizeof()¶
El operador unario (no es una función ni tampoco una macro) sizeof() devuelve el tamaño en bytes del operando. Este puede ser una variable, una expresión o (preferiblemente) un tipo. Cuando el operando es un array estático el resultado es el número de bytes que requiere almacenar el array completo. Por tanto, en este caso no es cierta la equivalencia entre arrays y punteros (es una excepción) pero tiene la ventaja de que es muy fácil prever desbordamientos de memoria cuando se trabaja con memoria estática o asegurarse de que el último byte de un array vale 0
Ejemplo básico: arrays con memoria reservada de manera dinámica¶
| Arrays dinámicos | |
|---|---|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | |
Lecturas recomendadas