El manejo de la memoria dinámica se realiza con funciones de la biblioteca de funciones. Se reserva un bloque de memoria con la función malloc y se libera con el procedimiento free.
A la función malloc se le pasa el número de bytes que debe ocupar el bloque y devuelve un puntero de tipo void* al bloque tomado. Para adaptar el puntero resultante al tipo necesario se aplica un cast. Si se produce un error o no puede tomar el bloque devuelve el valor especial, NULL. En la expresión del cálculo del parámetro a pasar a malloc con frecuencia se emplea el operador sizeof.
Al procedimiento free se le pasa un puntero devuelto por malloc y se encarga de liberar ese bloque, free no modifica el puntero pasado.
La relación existente entre punteros y vectores permite que se puedan crear vectores o matrices de tamaño variable en memoria dinámica y usarse con la misma sintaxis que los vectores. Para los vectores se solicita a malloc un bloque de memoria del tamaño del vector que se necesita multiplicado por el número de bytes que ocupa cada elemento. Ejemplos de creación de vectores en memoria dinámica se encuentran en la función malloc, el procedimiento free y en el operador sizeof.
La función productoMatriz calcula el producto de los elementos de una matriz de enteros. En la función main se crea una matriz dinámica creando un vector de vectores dinámicos, es decir, un vector de punteros que apuntan a vectores, estos vectores son las filas de la matriz.
#include <stdio.h> #include <stdlib.h> int productoMatriz(int **m, int nfilas, int ncolumnas) { int i, j, prod=1; for(i=0;i<nfilas;i++) for(j=0;j<ncolumnas;j++) prod *= m[i][j]; /* Se accede a cada elemento de la matriz */ return prod; } int main(){ int nfilas, ncolumnas, i, j; int **matriz; printf("Introduzca el número de filas y de columnas de la matriz\n"); /* Se lee el número de filas y de columnas */ scanf("%d",&nfilas); scanf("%d",&ncolumnas); /* Se crea el vector de punteros a filas */ matriz = (int **) malloc(nfilas*sizeof(int *)); /* Se crean las filas */ for(i=0; i<nfilas; i++) matriz[i] = (int *) malloc(ncolumnas*sizeof(int)); printf("Introduzca los elementos de la matriz\n"); for(i=0;i<nfilas;i++) for(j=0;j<ncolumnas;j++) { printf("matriz[%d][%d]=",i,j); scanf("%d",&matriz[i][j]); /* Se lee cada elemento de la matriz */ } printf("El producto de los elementos de la matriz es %d\n", productoMatriz(matriz,nfilas,ncolumnas)); /* Se destruyen las filas */ for(i=0; i<nfilas; i++) free(matriz[i]); /* Se destruye el vector de punteros */ free(matriz); return 0; }