Динамический указательный массив для динамического массива 2 измерений?

Мне нужно выделить массив char **, который указывает на массив массивов с двумя размерами.

В конце концов, я хочу указать на "ячейку", например players[playerNum][Row][Col]. Это то, что я написал до сих пор, но он терпит неудачу. Трудно понять логику, стоящую за ней, поэтому, если вы можете объяснить мне, что неправильно, это будет здорово.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
        int numOfPlayers;
        int i,j;
        char** players = (char **)malloc(sizeof(char**)*numOfPlayers); // players array
        for (i=0 ; i<numOfPlayers ; i++){
                players[i] = (char *)malloc(sizeof(char*)*10); // each player 1st D array
        }
        for (i=0 ; i<10 ; i++){
                for (j=0 ; j<10 ; j++){
                        players[i][j] = (char *)malloc(sizeof(char*)*10);      
                }
        }
        return 0;
}

Ответ 1

Распределение в коде неверно!

Сделайте следующее:

    char** players = malloc(sizeof(char*) * numOfPlayers); 
                                       ^ remove one *  
    for (i=0 ; i<numOfPlayers ; i++){
            players[i] = malloc(sizeof(char)* 10); // each player 1st D array
                                    //    ^ remove * it should be char
    }

Примечание: sizeof(char) != sizeof(char*).
Вам также не нужен второй вложенный цикл. (только выше код в порядке) Также избегайте возврата возвращаемого значения из malloc/calloc в C

Примечание Ошибка в вашем коде заключается в том, что numOfPlayers не инициализируется (вы пытаетесь использовать значение мусора).

Комментарий:

Но тогда у меня есть только 2D-массив. Мне нужен массив, который каждая ячейка из него указывает на 2D-массив, например... вы неправильно поняли мой вопрос

Читайте, если хотите - матрица массива String или /3D char

Чтобы выделить матрицу как: players[playerNum][Row][Col]

char ***players;
players = calloc(playerNum, sizeof(char**)); 
for(z = 0; z < playerNum; z++) { 
    players[z] = calloc(Row, sizeof(char*));
    for(r = 0; r < Row; r++) {
        players[z][r] = calloc(Col, sizeof(char));
    }
}

Изменить. Если вы хотите выделить продолжающуюся память для данных, вы можете использовать следующую технику. Это также будет предпочтительнее, потому что он делает меньше вызовов функции malloc.

char *players_data,  // pointer to char 
     ***players; // pointer to 2D char array
players_data = calloc(playerNum * Row * Col, sizeof(char)); //1 memory for elements 
players = calloc(playerNum, sizeof(char **)); //2 memory for addresses of 2D matrices 
for(i = 0; i < playerNum; i++){
  players[i] = calloc(Row, sizeof(char*)); //3 memory for data cols
  for(r = 0; r < Row; r++){ //4  Distributed memory among rows
     players[i][r] = players_data + (i * Row * Col) + (r * Col);
  }
}

Хорошая ссылка для изучения: Динамические трехмерные массивы в C\С++