Programación en C/Matrices Dinamicas
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
editarDejando 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 tiempo de ejecución la cantidad de memoria, con las ventajas y desventajas que esta posee.
Solo para demostrar rápidamente 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 debíamos 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 dependencia de la condición y libera
//Revisado por: Gustavo Chavarria.
//UNAN-LEON - Nicaragua.
Matrices Dinámicas de Dos Dimensiones
editarEn esta parte aprenderemos como usar la asignación dinámica en matrices bidimensionales. Este proceso se divide en dos partes:
- Asignar memoria a una matriz de punteros, cuyos elementos referencian cada una de las filas de la matriz de dos dimensiones que se desea crear.
- Asignar memoria para cada una de las filas. El número de elementos de cada fila puede ser variable.
Una vista rápida 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));
Según el código 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]) asignándole memoria.