Se hai bisogno di memoria contigua, hai un paio di scelte.
Si potrebbe allocare dinamicamente un unico blocco di memoria, e quindi calcolare le vostre offset manualmente, in questo modo:
size_t rows, cols;
...
int *arr = malloc(sizeof *arr * rows * cols);
...
arr[i * rows + j] = ...; // logically equivalent to arr[i][j]
è possibile impostare un secondo array di puntatori nella matrice principale:
int **arrp = malloc(sizeof *arrp * rows);
...
for (i = 0; i < rows; i++)
arrp[i] = &arr[i * rows];
...
arrp[i][j] = ...;
ricordando che è necessario liberare siaarr
e arrp
.
Se si dispone di un'implementazione C99, si può semplicemente impostare un puntatore ad un VLA, in questo modo:
int (*arrp)[cols] = (int (*)[cols]) arr;
...
arrp[i][j] = ...;
nota che in questo caso, non si è allocare la memoria per un array secondario, né è necessario calcolare manualmente i puntatori nell'array principale; tutto quello che devi fare è impostare arrp
nella stessa posizione di arr
e lasciare che le regole dell'aritmetica dei puntatori facciano tutto il lavoro.
Se le immagini non sono così grandi, si può solo impostare un VLA (di nuovo, C99 o successiva):
int arr[rows][cols];
ma in pratica questo non è una buona idea; i telai dello stack sono generalmente di dimensioni piuttosto limitate.
fonte
2012-02-21 20:04:35
Nessun puntatore doppio non è un array multidimensionale. –
Certo che no, ma puoi farlo funzionare come un array – Akshay
Perché utilizzare un'emulazione di un array 2D quando puoi semplicemente usarne uno? –