Sign up with your email address to be the first to know about new products, VIP offers, blog features & more.

Reservar memoria dinámica para una matriz en C

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:

a00a01a02
a10a11a12
a20a21a22

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):

a00a01a02a10a11a12a20a21a22

Dimensiones variables

Sin embargo, en el caso de la memoria dinámica, las cosas cambian. El mecanismo será el siguiente:

  • Declararemos un doble puntero “matriz” sobre el que reservaremos memoria para tantas filas tengamos.
  • Recorreremos el vector recién creado para reservar memoria para las columnas de cada fila.

Hay dos detalles a tener en cuenta:

  • La variable “matriz” será del tipo doble puntero ya que hará referencia a un vector de punteros.
  • Cada fila sí estará almacenada de forma consecutiva en memoria, pero éstas a su vez no estarán de forma obligada juntas, aunque podremos seguir accediendo de la misma forma.

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; 
} 

Leer entrada anterior
Ropa

Hay que ver, el otro día haciendo la colada me di cuenta de que la mayor parte de mi ropa...

Cerrar