Например чтобы к нему можно было обращаться вот так: SomeArray[x][y] = 0; а не вот так pSomeArray[x + (y*line_size)] = 0; Я обсясню почему. Исходник не мой, кода очень много. В изначальном варианте размер буффера был вполне приемлимым. А сейчас он около 20 мб, что уже не влезает в стек. Сделать глобальным я его тоже не могу по ряду причин. Сейчас склоняюсь к такому финту ушами: p = VirtualAlloc(0, BufferSize, MEM_COMIT, PAGE_READWRITE) _asm mov esp, [p] _asm add esp, BufferSize-4
Код (Text): int x = 0, y = 0; char **p = (char**)malloc(10); int i=0; for (i=0; i<10; i++) { p[i] = (char*)malloc(10); } p[5][5] = 0;
Или если нужен сплошняковый массив. Код (Text): #define LINE_LEN 10 #define ARRAY_SIZE 100 char (*p)[LINE_LEN] = (char(*)[LINE_LEN])malloc(LINE_LEN*ARRAY_SIZE); int i=0; for (i=0; i<ARRAY_SIZE; i++) { int y=0; for (y=0; y<LINE_LEN; y++) { p[i][y] = 0; } }
#4 *(*(base + i) + j) #5 *(base + i * col + j) в #5 со сплошным массивом только один доступ к памяти зато #4 намного гибче в плане использования памяти
есть еще способ Код (Text): size_t x = 0, i = 2, j = 2; char **base = malloc(i * j + sizeof(char*) * i), **tmp = base; while (x < i) *tmp++ = (char*)base + sizeof(char*) * i + x++ * j; base[0][1] = 'f'; base[1][0] = 'k'; free(base); с ведущими указателями фактически получается *(*(base + i) + j) только и массив указателей и двумерный массив хранятся в одном сплошном массиве но это скорее экзотика а не способ помимо того что двойное обращение к памяти как #4 так еще и гибкости никакой как в #5