Если вам нужна память, чтобы быть смежной, у вас есть пара выбор.
Вы можете динамически выделить один блок памяти, а затем вычислить ваши смещения вручную, например, так:
size_t rows, cols;
...
int *arr = malloc(sizeof *arr * rows * cols);
...
arr[i * rows + j] = ...; // logically equivalent to arr[i][j]
Вы можете создать второй массив указателей на основной массив:
int **arrp = malloc(sizeof *arrp * rows);
...
for (i = 0; i < rows; i++)
arrp[i] = &arr[i * rows];
...
arrp[i][j] = ...;
Помня, что вам нужно было бы освободить иarr
и arrp
.
Если у вас есть реализация C99, вы можете просто установить указатель на VLA, например, так:
int (*arrp)[cols] = (int (*)[cols]) arr;
...
arrp[i][j] = ...;
Обратите внимание, что в этом случае, вы не выделять какой-либо памяти для вторичного массива, и вам не нужно вручную вычислять указатели в основной массив; все, что вам нужно сделать, это установить arrp
в том же месте, что и arr
, и пусть правила арифметики указателя выполняют всю работу.
Если изображения не настолько большой, вы можете просто настроить VLA (опять же, C99 или более поздней версии):
int arr[rows][cols];
, но на практике это не очень хорошая идея; фреймы стека обычно довольно ограничены по размеру.
Нет двойной указатель не многомерный массив. –
Конечно нет, но вы можете заставить его вести себя как массив – Akshay
Зачем использовать эмуляцию двумерного массива, когда вы просто можете его использовать? –