1

我需要分配一个指向二维字符数组的 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;
}
4

1 回答 1

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 循环。(上面的代码很好) 也避免在 C 中从 malloc/calloc 转换返回值

注意您的代码中的一个错误 numOfPlayers是未初始化(您正在尝试使用垃圾值)。

评论:

但是,我只有二维数组。我需要一个数组,他的每个单元格都指向一个像这样的二维数组......你误解了我的问题

如果需要,请阅读 -字符串矩阵或/ 3D 字符数组

分配一个矩阵,如: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\C++ 中的动态三维数组

于 2013-07-20T10:24:40.830 回答