Ответ 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\С++