Programación en C/Matrices Dinamicas

De Wikilibros, la colección de libros de texto de contenido libre.

Esta sección es mas como un tema mas de asignación dinámica de memoria, pero por motivos pedagógicos he decidido dividirlo.

Concepto

Dejando afuera el uso de matrices en C99, en donde uno puede declarar los valores luego de una lectura. Podemos decir que solo hemos usado matrices estáticas, ya que no permitían el cambio de dimensiones una vez que el programa fuese compilado.

Con la asignación dinámica de memoria un puede definir en tipo de ejecución la cantidad de memoria, con las ventajas y desventajas que esta posee.

Solo para demostrar rapidamente el potencial y el por que usarlo, vean lo siguiente:

Anteriormente si uno deseaba leer una cadena de caracteres, declaraba un array, supongamos que deseamos leer un nombre, pero, no todos se llaman igual es por esto que debiamos darle suficiente espacio al arreglo.

char nombre[100];

Pero si escribimos: Gustavo Chavarria. Solo necesitamos unos 20 caracteres (20 bytes), es decir desperdiciamos 80 bytes en memoria. Imaginate sucediendo esto en un programa muy grande...

Ejemplo:

//Hecho por: Gustavo Chavarria.
//UNAN-LEON - Nicaragua.
#include <stdio.h>
#include <stdlib.h>

int main()
{
int *puntero=NULL;
puntero = (int *)malloc(100*sizeof(int)); //Asignacion dinamica de memoria

	if (puntero == NULL)  //evaluacion de condicion.
	{
		printf("NO hay suficiente espacio en memoria"); //Mensaje
		return -1; 				 //Cierra el programa con un error.
	}else
	printf("Se asigno memoria  ");

free(puntero);//liberacion de memoria
return 0;
}
//El programa solo asigna memoria, imprime un mensaje en dependecia de la condicion y libera

//Revisado por: Gustavo Chavarria.
//UNAN-LEON - Nicaragua.

Matrices Dinamicas de Dos Dimensiones

En esta parte aprenderemos como usar la asignacion dinamica en matrices bidimensionales. Este proceso se divide en dos partes:

  • Asignar memoria a una matriz de punteros, cuyos elementos referenciaran cada una de las filas de la matriz de dos dimensiones que se desea crear.
  • Asignar memoria para cada una de las filas. El numero de elementos de cada fila puede ser variable.

Una vista rapida seria:

#define FILAS 5
#define COLS 6
...
int **matriz;
matriz = (int **)malloc (FILAS*sizeof(int *));

for (i=0;i<FILAS;i++)
matriz[i] = (int *) malloc (COLS*sizeof(int));

Segun el codigo anterior podemos decir que cada fila puede tener una cantidad de columnas de diferentes tamaños. El uso del for, es para poder acceder a cada fila (matriz[i]) asignandole memoria.