Programación en C/Matrices Dinámicas

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

Como ya hemos visto el lenguaje de programación C posee la capacidad de poder asignar nuevos espacios de memoria para variables bidimensionales, como los arreglos de caracteres el cual en momentos que el programa se ejecuta no se sabe con certeza cuanto espacio ocupara una cadena de caracteres , dando así la posibilidad de asignar memoria al arreglo , re dimensionar y posteriormente a liberarlo.

En este punto nos centraremos en las matrices dinámicas las cuales pueden cambiar su tamaño en tiempo de ejecución si el usuario lo desea, esto es valido para arreglos unidimensionales, bidimensionales, tridimensionales o multidimensionales. Teniendo en cuenta que las matrices bidimensionales son tablas con las cordenadas (X,Y) pudiendo crecer tanto en las coordenadas X como en las Y, y en tridimensionales con coordenadas cambiantes en (X,Y,Z) o multidimensionales con mas coordenadas de tablas. Nos centraremos en las bidimensionales que son las mas útiles ya que se usa para el manejo de tablas con coordenadas (X,Y) que varían en tiempo de ejecución.

Ejemplo 1 - Creando arreglo bidimensional que soporte de columnas y filas de manera variable.

/* 
Creado por Juan Carlos Lanuza L. 
                ATLAS Laboratories
                UNICIT Universidad Iberoamericana de Ciencia y Tecnología
Managua Nicaragua 2017

OPEN SOURCE CODE - Libre modificación y distribución

*/

#include <stdio.h>
#include <stdlib.h>

int **matrix = NULL; // se asgina el NULL en caso de valores erráticos

int main(void)
{
	int col,fil; // almacenan las cantidades de columnas y filas
	int x,y; // para el movimiento entre los arreglos

	fprintf(stdout,"Ingresa Columnas: ");
	scanf("%d",&col);
	fprintf(stdout,"Ingresa Filas: ");
	scanf("%d",&fil);
	
	matrix = (int **)malloc(fil*sizeof(int*)); // se asigna memoria para las filas
	if(matrix == NULL) { perror(""); } // se comprueba si no hay errores
	
	for (int i = 1;i <= fil;i++) // se inicia un movimiento en el arreglo para asignar memoria para las columnas 
	{
		matrix[i] = (int*)malloc(col*sizeof(int)); // se asigna memoria mientras se mueve por el arreglo
		if(matrix[i] == NULL) perror("Error: "); // se comprueba que no hay errores
	}
	
	for(y = 0;y < fil;y++) // esto nos movera por las filas
	{
		for(x = 0;x < col;x++) // esto nos movera por las columnas
		{
			fprintf(stdout,"Valor [%d][%d] : ",y,x); // nos imprimira por que columna y fila (coordenada) estamos
			scanf("%d",&matrix[y][x]); // se asigna el valor a la matrix
		}
	}
	puts("Matriz Actual");
	puts("-------------");
	for(y = 0;y < fil;y++)
	{
		for(x = 0;x < col;x++)
		{
			fprintf(stdout,"%d\t",matrix[y][x]); // se imprime los resultados para la visualización previa
		}
		puts(\n);// salto de linea 
	}	
	free(matrix); // se libera la memoria asignada a la matriz si asi se requiere
	matrix = NULL; // se asigna NULL por metodos de seguridad 
	return 0;
}