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)等。