[Tutorial C] VI - Asignación dinámica de memoria
Página 1 de 1.
[Tutorial C] VI - Asignación dinámica de memoria
Asignación dinámica de memoria
Hasta ahora estamos trabajando con variables fijas, no dejamos libertad a que el usuario pueda crear distintas variables según su interes. Es un poco dificl de explicar así, así que pondré un ejemplo: imagina que quieres hacer un codificador de texto, no sabes cuanto espacio vas a necesitar en memoria hasta que el usuario mete el texto, que puede ser una palabra o un libro entero. La solución de novato es poner un char[10000], pero incluso así nos podemos quedar cortos, y en caso de tener que descrifrar una palabra, sobra demasiado espacio. Tenemos que poder cambiar las variables y crearlas en función de lo que suceda, ¿no? De eso trata esta lección.
Las funciones malloc(), realloc(), calloc() y free(), de la liberia stdlib.h, o malloc.h se encargan de realizar esta tarea. Todos los datos se almacenan en el almacén libre (heap), que es una pila limitada a 64K en un principio, todo esto varía de la maquina. Todas las variables que declarabas hasta ahora iban a la pila, ahora tu dirás a donde van, de un modo indirecto.
malloc() ( MALLOC viene de Memory ALLOCation, alojamiento en la memoria)
Con esta función, se obtiene un puntero que apunta a un bloque asignado de memoria. Su estructura es:
Por último, ahora que el puntero tiene contenido, le damos un valor.
Ahora, no solo podemos crear variables de la nada, sino tablas de la nada, o mejor dicho, tablas dinámicas, cuyo espacio no es fijio y puede cambiar, e incluso desaparecer ( ver free() ). Veamos un ejemplo concreto:
free()
Si un malloc() no encuentra sitio en la memoria, devuelve nulo ( cero ). Para que no ocurra, existe esta función que libera bloques usados por la función malloc() antes descrita. Como esa función ocupa un bloque con un puntero, free() lo libera para que pueda ser usado por otro. Estructura:
calloc()
Es como un malloc() pero más especializado, lo puedes comprobar son su estructura:
realloc()
Esta función si presenta una novedad. Permite ampliar con espacio libre un bloque de espacio ya existente. Puedes crear un bloque de memoria y su puntero, con malloc() o calloc(), y luego puedes ampliar ese bloque. Su estructura es:
Hasta ahora estamos trabajando con variables fijas, no dejamos libertad a que el usuario pueda crear distintas variables según su interes. Es un poco dificl de explicar así, así que pondré un ejemplo: imagina que quieres hacer un codificador de texto, no sabes cuanto espacio vas a necesitar en memoria hasta que el usuario mete el texto, que puede ser una palabra o un libro entero. La solución de novato es poner un char[10000], pero incluso así nos podemos quedar cortos, y en caso de tener que descrifrar una palabra, sobra demasiado espacio. Tenemos que poder cambiar las variables y crearlas en función de lo que suceda, ¿no? De eso trata esta lección.
Las funciones malloc(), realloc(), calloc() y free(), de la liberia stdlib.h, o malloc.h se encargan de realizar esta tarea. Todos los datos se almacenan en el almacén libre (heap), que es una pila limitada a 64K en un principio, todo esto varía de la maquina. Todas las variables que declarabas hasta ahora iban a la pila, ahora tu dirás a donde van, de un modo indirecto.
malloc() ( MALLOC viene de Memory ALLOCation, alojamiento en la memoria)
Con esta función, se obtiene un puntero que apunta a un bloque asignado de memoria. Su estructura es:
- Código:
puntero = (tipo) malloc(tamaño en bytes);
- Código:
int *p;
p = (int*) malloc(sizeof(int));
*p = 5;
Por último, ahora que el puntero tiene contenido, le damos un valor.
Ahora, no solo podemos crear variables de la nada, sino tablas de la nada, o mejor dicho, tablas dinámicas, cuyo espacio no es fijio y puede cambiar, e incluso desaparecer ( ver free() ). Veamos un ejemplo concreto:
- Código:
//Tabla típica
int tabla[256];
//Tabla dinámica
int *tab;
tab = (int*) malloc(256*sizeof(int));
- Código:
int a;
scanf("%i",&a);
int tabla[a];
- Código:
tabla = (int*) malloc(numero_de_elementos*sizeof(int));
- Código:
int *tab;
tab = (int*) malloc(256*sizeof(int));
tab[34] = 5;
- Código:
int **tab;
tab = (int **) malloc(10*sizeof(int*));
tab[3] = (int*) malloc(10*sizeof(int));
tab[3][4] = 5;
free()
Si un malloc() no encuentra sitio en la memoria, devuelve nulo ( cero ). Para que no ocurra, existe esta función que libera bloques usados por la función malloc() antes descrita. Como esa función ocupa un bloque con un puntero, free() lo libera para que pueda ser usado por otro. Estructura:
- Código:
free(puntero);
- Código:
int **tab;
tab = (int **) malloc(10*sizeof(int*));
tab[3] = (int*) malloc(10*sizeof(int));
tab[3][4] = 5;
free(tab);
calloc()
Es como un malloc() pero más especializado, lo puedes comprobar son su estructura:
- Código:
puntero = (tipo) calloc(numero_elementos,tamaño_por_elemento);
- Código:
int *p;
p = (int*) calloc(50,sizeof(int));
realloc()
Esta función si presenta una novedad. Permite ampliar con espacio libre un bloque de espacio ya existente. Puedes crear un bloque de memoria y su puntero, con malloc() o calloc(), y luego puedes ampliar ese bloque. Su estructura es:
- Código:
puntero = realloc(puntero_de_bloque, tamaño_a_añadir);
- Código:
char *p;
p = (char*) malloc(30*sizeof(char));
p = (char*) realloc(p, 15*sizeof(char));
Temas similares
» [Tutorial C++] I - "HelloWorld++"
» [Tutorial C] II.5 - Bucles
» [Tutorial C] II.6 - Enumeraciones
» [Tutorial C] IV.3 - Estructuras
» [Tutorial C] IV.1 - Punteros
» [Tutorial C] II.5 - Bucles
» [Tutorial C] II.6 - Enumeraciones
» [Tutorial C] IV.3 - Estructuras
» [Tutorial C] IV.1 - Punteros
Página 1 de 1.
Permisos de este foro:
No puedes responder a temas en este foro.
|
|