动态指针数组到动态二维数组?

时间:2013-07-20 10:22:14

标签: c arrays char malloc

我需要分配一个指向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 个答案:

答案 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);
  }
}

学习的好参考:Dynamic Three Dimensional Arrays in C\C++