Si necesita que la memoria sea contigua, tiene un par de elecciones.
Se podría asignar dinámicamente un solo bloque de memoria, y luego calcular sus desplazamientos de forma manual, así:
size_t rows, cols;
...
int *arr = malloc(sizeof *arr * rows * cols);
...
arr[i * rows + j] = ...; // logically equivalent to arr[i][j]
podría configurar una segunda matriz de punteros en la matriz principal:
int **arrp = malloc(sizeof *arrp * rows);
...
for (i = 0; i < rows; i++)
arrp[i] = &arr[i * rows];
...
arrp[i][j] = ...;
recordando que tendrías que liberar arr
y arrp
.
Si usted tiene una aplicación C99, sólo puede configurar un puntero a un VLA, así:
int (*arrp)[cols] = (int (*)[cols]) arr;
...
arrp[i][j] = ...;
Tenga en cuenta que en este caso, usted no está cualquier reserva de memoria para una matriz secundaria, tampoco es necesario calcular manualmente los punteros en la matriz principal; todo lo que tiene que hacer es establecer arrp
en la misma ubicación que arr
y dejar que las reglas de la aritmética del puntero hagan todo el trabajo.
Si las imágenes no son tan grandes, que sólo podría configurar una VLA (de nuevo, C99 o posterior):
int arr[rows][cols];
pero en la práctica esto no es una buena idea; los marcos de pila generalmente son bastante limitados en tamaño.
Ningún puntero doble no es una matriz multidimensional. –
Ciertamente no, pero puede hacerlo funcionar como una matriz – Akshay
¿Por qué usar una emulación de una matriz 2D cuando simplemente puede usar una? –