我需要分配一个指向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;
}
答案 0 :(得分:4)
代码中的分配错误!
这样做:
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*)
。
您也不需要第二个嵌套for循环。 (上面的代码很好)
Also avoid casting return value from malloc/calloc in C
注意代码中的错误是numOfPlayers
未初始化(您正在尝试使用垃圾值)。
注释:
但是,我只有2D阵列。我需要一个数组,他的每个单元都指向一个2D数组,就像这样......你误解了我的问题
如果您愿意,请阅读matrix of String or/ 3D char array
分配如下的矩阵: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);
}
}