2011-04-02 110 views
0

我遇到了返回多维数组的问题。我在一个函数中创建数组,然后在另一个函数中修改它。在主函数中,我想打印出如下所示的数组内容,但是,我没有得到任何东西显示在控制台中。返回多维数组c

有什么建议吗?谢谢。

//Build the grid array given the number of rows, columns and levels 
char ***buildGrid(int numRows, int numCols, int numLevels) 
{ 
    char ***levels; 
    levels = malloc(numLevels *sizeof(char *)); //Contains all levels 

    int rowIndex, levelIndex; 

    for (levelIndex = 0; levelIndex < numLevels; levelIndex++) 
    { 
     char **level = malloc(numRows * sizeof(char *)); //Contains all rows 

     for(rowIndex = 0; rowIndex < numRows; rowIndex++) 
     { 
      level[rowIndex] = malloc(numCols * sizeof(char)); //Contains all columns 
     }  

     levels[levelIndex] = level; 
    } 

    return levels; 
} 

void readGrid(char ***grid) 
{ 
    grid = buildGrid(3,3,3); 

    grid[0][0][0] = 'a'; 
} 

int main (int argc, const char * argv[]) 
{ 
    char ***gridData; 

    readGrid(gridData); 

    printf("%c", gridData[0][0][0]); //This does not output anything 

    return 0; 
} 
+0

Gasp!当你到达***或****时,你可能没有找到正确的方向! – 2011-04-02 16:35:26

+0

它假设是一个3D数组。否则你会如何建议。 – David 2011-04-02 16:42:50

回答

2

我认为你应该做

readGrid(&gridData); 

void readGrid(char**** grid) 
{ 
    *grid = buildGrid(3,3,3); 

    (*grid)[0][0][0] = 'a'; 
} 

那是因为你想改变的gridData内容。

此外,定义主要为int main(void)

+0

在旁注。你还应该写'printf(“%c \ n”,gridData [0] [0] [0]);'使输出更清晰。 – Muggen 2011-04-02 16:39:17

0

在main()网格中未声明,所以你的代码甚至不会编译。你可能是指gridData。

但是,然后gridData未初始化,并取消引用它导致未定义的行为。此外,“void main()”也是未定义的行为,所以不检查malloc()的返回值并对其进行解引用。

+0

不好意思,printf应该是gridData。 – David 2011-04-02 16:29:37

2

在主,按值传递格指针,而不是地址。每当你想改变一个变量的内容时,你必须给它的地址,否则,只有它的副本将被改变,所以无论何时你想在另一个函数中改变char*** gridData;,另一个函数应该接收到一个类型为char****的参数,你应该叫它readGrid(&gridData)等。