C - Функция для динамического выделения 3-х мерного массива (используя mallo c) - PullRequest
1 голос
/ 21 апреля 2020

Я создал эту функцию для динамического выделения трехмерного массива.

int ***create_3D_Array(int nb_block, int nb_lin, int nb_col) {
    int i, j;
    int ***A = (int***)malloc(nb_block * sizeof(int**));
    for (i = 0; i <nb_col; i++) {
        A[i] = (int**)malloc(nb_col * sizeof(int*));
        for (j = 0; j < nb_lin; j++) {
            A[i][j] = (int*)malloc(nb_lin * sizeof(int));
        }
    }
    return A;
}

Затем я использовал ее здесь

int ***all_blocks = NULL;
all_blocks = create_3D_Array(54, 5, 5);

Однако она работает неправильно, потому что, когда я хочу дать значение моего 6-го блока all_blocks[5], программа перестает работать.

Есть ли ошибки в моей функции?

1 Ответ

1 голос
/ 21 апреля 2020

Размеры неверны в ваших контурах размещения. Внешний l oop должен работать до nb_block, второй mallo c должен выделять nb_lin * sizeof(int*), а третий mallo c должен выделять nb_col * sizeof(int).

Вот исправленная версия:

int ***create_3D_Array(int nb_block, int nb_lin, int nb_col) {
    int i, j;
    int ***A = (int***)malloc(nb_block * sizeof(int**));
    for (i = 0; i < nb_block; i++) {
        A[i] = (int**)malloc(nb_lin * sizeof(int*));
        for (j = 0; j < nb_lin; j++) {
            A[i][j] = (int*)malloc(nb_col * sizeof(int));
        }
    }
    return A;
}

Обратите внимание, что может быть проще использовать прямой 3D-массив:

int (*all_blocks)[5][5] = malloc(54 * sizeof(*all_blocks));
...