Выделить память на char *** в C

Итак, у меня возникают проблемы с распределением памяти для переменной типа char *** . Моя цель состоит в том, чтобы создать матрицу строк и код, который я сейчас имею для выделения памяти, следующий:

 char ***matrix; matrix = calloc(n*MAX_STR, sizeof(char**)); for(z = 0; z < n; z++) { matrix[z] = calloc(n, sizeof(char*)); for(i = 0; i < MAX_STR; i++) { matrix[z][i] = calloc(MAX_STR, sizeof(char)); } } 

Я успешно выделил память для массива строк, используя это:

 char **list; list = calloc(n, sizeof(char *)); for (j = 0; j < n; j++){ list[j] = calloc(MAX_STR, sizeof(char)); } 

но теперь у меня проблемы с матрицей.

Запуск программы с помощью –leak-check = full на Valgrind дает мне следующее сообщение:

 ==5126== Invalid write of size 8 ==5126== at 0x400B9F: createmat (proj.c:100) ==5126== by 0x401598: main (proj.c:237) ==5126== Address 0x5210878 is 0 bytes after a block of size 72 alloc'd ==5126== at 0x4C2ABB4: calloc (vg_replace_malloc.c:593) ==5126== by 0x400B52: createmat (proj.c:98) ==5126== by 0x401598: main (proj.c:237) 

Я хотел бы выяснить, как выделить память для этого, так как я все еще новичок, когда дело доходит до управления памятью в C. Любая помощь была бы оценена, спасибо.

EDIT: предполагается, что в матрице хранится n массивов строк, которые соответствуют строкам ввода (они считываются позже с помощью fgets ), и каждый массив выделяет любое число слов, которое имеет строка, каждое слово (чтение, каждая строка) имея максимальное число символов MAX_STR . n – переменная, считываемая с ввода, а MAX_STR – константа, определенная в программе.

    Предполагая, что вы хотите выделить хранилище для n массивов, каждый из которых MAX_STR n строк, каждый из которых имеет длину до MAX_STR в MAX_STR есть пара ошибок

     matrix = calloc(n*MAX_STR, sizeof(char**)); 

    должно быть

     matrix = calloc(n, sizeof(char**)); 

    а также

     for(i = 0; i < MAX_STR; i++) { 

    должно быть

     for(i = 0; i < n; i++) { 

    Немного более подробно,

     matrix = calloc(n*MAX_STR, sizeof(char**)); for(z = 0; z < n; z++) { 

    кажется неправильным. Вы выделяете элементы n*MAX_STR но используете только n из них

     matrix[z] = calloc(n, sizeof(char*)); for(i = 0; i < MAX_STR; i++) { 

    также является сомнительным и неверно для n . (Вы выделяете n элементов, а затем пишите в MAX_STR из них.)

    Наконец, в зависимости от того, считаете ли вы MAX_STR необходимым пространство для нулевого терминатора, вам может потребоваться изменить

     matrix[z][i] = calloc(MAX_STR, sizeof(char)); 

    в

     matrix[z][i] = calloc(MAX_STR+1, 1); 

    Матрица массива String или / 3D:

    Предположим, вам нужны N матриц, каждая matrix может хранить строки R длиной MAX_STR-1 тогда вы должны выделить ячейку памяти следующим образом:

     char ***matrix; matrix = calloc(N, sizeof(char**)); for(z = 0; z < N; z++) { matrix[z] = calloc(R, sizeof(char*)); for(i = 0; i < R; i++) { matrix[z][i] = calloc(MAX_STR, sizeof(char)); } } 

    Его создаст matrix как:

     matrix +-------------------+------------------+-----------------------+ | 0 | 1 | 2 | +-------------------+------------------+-----------------------+ | | | ▼ ▼ ▼ +--+ +----------+ +--+ +----------+ +--+ +----------+ |0 +---►| MAX_STR | |0 +---►| MAX_STR | |0 +---►| MAX_STR | +--+ +----------+ +--+ +----------+ +--+ +----------+ |1 +---►| MAX_STR | |1 +---►| MAX_STR | |1 +---►| MAX_STR | +--+ +----------+ +--+ +----------+ +--+ +----------+ |2 +---►| MAX_STR | |2 +---►| MAX_STR |* |2 +---►| MAX_STR | +--+ +----------+ +--+ +----------+ +--+ +----------+ |3 +---►| MAX_STR | |3 +---►| MAX_STR | |3 +---►| MAX_STR | +--+ +----------+ +--+ +----------+ +--+ +----------+ |4 +---►| MAX_STR | |4 +---►| MAX_STR | |4 +---►| MAX_STR | +--+ +----------+ +--+ +----------+ +--+ +----------+ |5 +---►| MAX_STR | |5 +---►| MAX_STR | |5 +---►| MAX_STR | +--+ +----------+ +--+ +----------+ +--+ +----------+ |6 +---►| MAX_STR | |6 +---►| MAX_STR | |6 +---►| MAX_STR | +--+ +----------+ +--+ +----------+ +--+ +----------+ |7 +---►| MAX_STR | |7 +---►| MAX_STR | |7 +---►| MAX_STR | +--+ +----------+ +--+ +----------+ +--+ +----------+ ^ ^ | | | matrix[z][i] matrix[z] 

    Здесь N = 3 и
    R = 8

    Его char 3D-массив размерной matrix[N][R][MAX_STR]

    Предположим, если кто-то хочет напечатать строку, помеченную * на диаграмме, это третья строка во втором массиве, тогда ему нужно индексировать как

     printf("%s",matrix[1][2]); 

    Хотя ответ принят, я обновляю свой ответ, поэтому он может найти его полезным в будущем

    Как вы уже сказали, вы смогли успешно создать массив строк, используя приведенный ниже код:

     char **list; list = calloc(n, sizeof(char *)); for (j = 0; j < n; j++){ list[j] = calloc(MAX_STR, sizeof(char)); } 

    Теперь вам нужен массив массивов строк, поэтому он должен быть:

     char ***matrix; matrix = calloc(n, sizeof(char**)); //This creates space for storing the address of 'n' array of strings for(z = 0; z < n; z++) { //This loop creates the 'n' array of strings. matrix[z] = calloc(n, sizeof(char*)); for(i = 0; i < n; i++) { matrix[z][i] = calloc(MAX_STR, sizeof(char)); } } 

    Итак, в основном, во втором коде вы просто создаете пространство для хранения списков «n». Надеюсь, это ясно.