Memoria Dinámica

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);
btn1 btn
btn

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s