Ваш макрос неверен, как уже упоминали другие. Исправить это хорошо, но я бы посоветовал вместо этого выделять многомерный массив напрямую, а не вручную сворачивать макрос смещения. Проверьте этот пример:
#include <assert.h>
#include <stdlib.h>
#define SIZE_A 1
#define SIZE_B 3
#define SIZE_C 4
#define SIZE_D 2
int main(void)
{
int counter = 0;
int (*array)[SIZE_A][SIZE_B][SIZE_C][SIZE_D] =
malloc(sizeof(int) * SIZE_A * SIZE_B * SIZE_C * SIZE_D);
for (int a = 0; a < SIZE_A; ++a)
for (int b = 0; b < SIZE_B; ++b)
for (int c = 0; c < SIZE_C; ++c)
for (int d = 0; d < SIZE_D; ++d)
(*array)[a][b][c][d] = counter++;
counter = 0;
for (int a = 0; a < SIZE_A; ++a)
for (int b = 0; b < SIZE_B; ++b)
for (int c = 0; c < SIZE_C; ++c)
for (int d = 0; d < SIZE_D; ++d)
{
int value = (*array)[a][b][c][d];
assert(value == counter++);
}
return 0;
}
Расположение в памяти массива, выделенного в этом примере, точно такое же, как и в вашем вопросе, но почему бы не позволить компилятору сделать всю работу за вас?
Немного о редакционной статье - не приводите возвращаемое значение вызова malloc()
в программе на Си. Преобразование из void *
является неявным, и наличие явного приведения может скрыть предупреждения о неявном объявлении функции, которые вы получите в противном случае - например, если вы забыли включить stdlib.h
.