Acabamos de hablar hace nada de cómo reservar memoria para un vector unidimensional de forma dinámica con C. Hoy le toca el turno a las matrices o arrays bidimensionales. Los vectores se organizan de forma lineal, secuencial y con todos los elementos en posiciones correlativas en la memoria. Las matrices se almacenan en forma de vector de vectores.
Dimensiones fijas
Si es de dimensiones fijas (declarándolas como matriz[filas][columnas]), el vector de vectores se guardará también uno al lado del otro.
Por lo tanto, en una matriz del tipo:
a00 | a01 | a02 |
a10 | a11 | a12 |
a20 | a21 | a22 |
En memoria (en la que los elementos los direccionamos en una sola dirección) los tendríamos de la siguiente forma (en cada lenguaje este criterio cambia, en Fotran se almacena en forma de vector de columnas):
a00 | a01 | a02 | a10 | a11 | a12 | a20 | a21 | a22 |
Dimensiones variables
Sin embargo, en el caso de la memoria dinámica, las cosas cambian. El mecanismo será el siguiente:
Hay dos detalles a tener en cuenta:
Veamos un ejemplo con código real (no hace comprobaciones de que el malloc se ejecute correctamente):
#include <stdlib.h> #include <stdio.h> int main(void) { int filas = 2; int columnas = 3; int **x; int i; // Recorre filas int j; // Recorre columnas // Reserva de Memoria x = (int **)malloc(filas*sizeof(int*)); for (i=0;i<filas;i++) x[i] = (int*)malloc(columnas*sizeof(int)); // Damos Valores a la Matriz x[0][0] = 1; x[0][1] = 2; x[0][2] = 3; x[1][0] = 4; x[1][1] = 5; x[1][2] = 6; // Dibujamos la Matriz en pantalla for (i=0; i<filas; i++) { printf("\n"); for (j=0; j<columnas; j++) printf("\t%d", x[i][j] ); } return 0; }
Puesto que estamos hablando bastante de C en el curso de programación de videojuegos con SDL, voy a publicar una serie de pequeños apuntes sobre programación en C que seguro que os son de utilidad. No van a constituir un curso como tal pero serán una serie de entradas relacionadas sobre este tema.