Tipos de Memoria
La memoria Estética
- Sin importa nada, ocupa todo el espacio de las variables que declaramos, no le importa si las usamos.
Memoria Dinámica
- Puede hacerse más más compleja y dar muchos errores.
- Da la capacidad de modificar tamaño de variables.
- SIEMPRE se usan punteros.
- Es mucho más lento un programa que la implemente pues ocupa más instrucciones.
Funciones de Memoria Dinámica
Para poder usarla hay que añadir a librería
Malloc
- Esta función sirve para reservar un espacio de memoria tan grande como se especifica dentro de la función.
- La función malloc() y en general, cualquier función de reserva dinámica de memoria, devuelve un puntero nulo (NULL) si la reserva de memoria no puede realizarse, generalmente por falta de memoria disponible.
- Por ello, antes de usar un puntero devuelto por la función malloc() es imprescindible comprobar que dicho puntero no es nulo (NULL).
Calloc
- Esta función sirve para reservar un espacio de memoria tan grande como se especifica dentro de la función y al mismo tiempo inicializa todos a 0.
- Es mucho más lento que Malloc.
Realloc
- Redimensiona un tipo de dato que asignamos con Malloc pero conservando sus valores.
Free
La memoria dinámica reservada es eliminada siempre al terminar la ejecución del programa por el propio sistema operativo. Sin embargo, durante la ejecución del programa puede ser interesante, e incluso necesario, proceder a liberar parte de la memoria reservada con anterioridad y que ya ha dejado de ser necesario tener reservada.
Esto puede realizarse mediante la función free(). La función free() tiene la forma:
void free(void *p);
Donde p es la variable de tipo puntero cuya zona de memoria asignada de forma dinámica queremos liberar.
Vectores Dinámicos
Declararlo
tipo *NombreArray;
Donde:
- tipo Es un tipo de dato (int, char)
Asignarle un tamaño al Vector(Malloc)
NombreDelVector = (tipo*)malloc( Tamaño*sizeof(tipo) );
Donde:
- Tamaño Es el número de posiciones que tendrá nuestro vector.
- Tipo Es un tipo de dato (int, char)
Aquí unos ejemplos:
// == EJEMPLO 1 == //Declararlo int *Vector1; //Ponerle tamaño al Vector Vector1 = (int*)malloc(50*sizeof(int)); // == EJEMPLO 2 == //Declararlo double **Vector2; //Ponerle tamaño al Vector *Vector2 = (double**)malloc(70*sizeof(double*));
Asignarle un tamaño al Vector(Calloc)
NombreDelVector = (tipo*)calloc( Tamaño*sizeof(tipo) );
Donde:
- Tamaño Es el número de posiciones que tendrá nuestro vector.
- Tipo Es un tipo de dato (int, char)
Modificar el tamaño del Vector
NombreDelVector = (tipo*)realloc( NombreDelVector, NuevoTamaño*sizeof(tipo) );
Strings Dinámicos
Para trabajar con ellos es mucho más sencillo genera un string estático y en el meter los valores iniciales y ya luego pasarle los valores al string dinámico que los conservara.
Declararlo
char NombreDelString; //Vector Real char StringAux; //Vector Auxiliar
Asignarle un tamaño al Vector(Malloc)
NombreDelString = (char*)malloc((strlen(StringAux)+1)*sizeof(char));
Matrices Dinámicos
Declararlo
2D
tipo **NombreDeLaMatriz;
3D
tipo ***NombreDeLaMatriz;
Asignarle un tamaño al Vector(Malloc)
2D
//Genera un array Matriz = (int **)malloc(filas*sizeof(int *)); //Dentro de cada elemento haz un array for(i=0; i<filas; i++){ Matriz[i] = (int*)malloc(columnas*sizeof(int)); }
3D
//Genera un array Matriz = (int ***)malloc(altura*sizeof(int **)); //Dentro de cada elemento haz un array for(i=0; i<altura; i++){ //Genera un array Matriz[i] = (int **)malloc(filas*sizeof(int *)); //Dentro de cada elemento haz un array for(j=0; j<filas; j++){ Matriz[i][j] = (int*)malloc(columnas*sizeof(int)); } }
Notación Puntero-Array
Notación |
|
Vector[x]; | *(Vector + x); |
Vector[x][y]; | *(*(Vector+x) + y); |
Vector[x][y][z]; | *(*(*(Vector+x) + y) + z); |
![]() |
![]() |
![]() |