2012-08-26 18 views
3

我使用下面的代碼片段爲最小數量的malloc()調用分配二維數組的內存。用最小數量的malloc調用分配二維數組的內存

我想用下標p [i] [j]來訪問數組。

#define ROW 3 
#define COL 2 

int main() 
{ 
    void **ptr = malloc(ROW*COL* sizeof(int)); 

    int (*p)[COL] = ptr; 

    int i, j; 

    for(i = 0; i < ROW; ++i) 
      for(j = 0; j < COL; ++j) 
        scanf("%d", &ptr[i][j]); 

    for(i = 0; i < ROW; ++i) 
    { 
      for(j = 0; j < COL; ++j) 
        printf("%d ", p[i][j]); 
      printf("\n"); 
    } 

    return 0; 
} 

程序正確輸出任何輸入。

但是,它顯示Runtime error。爲什麼?

+0

不,你所看到的輸入。該程序不輸出任何東西。 –

+0

不應該將'scanf'輸入讀入'p',而不是'ptr'? –

+0

是的,明白了。我想睡覺。我的錯。 –

回答

7

如果數組維數在編譯時已知(如你的例子),那麼你確實可以在一個malloc調用中分配內存。但是您必須使用正確的指針類型來訪問該內存。在你的情況下,這將是你的p指針。指針被正確聲明,但由於某種原因,您完全忽略了它在scanf中的存在,並使用ptr代替。

停止嘗試使用ptr進行數組訪問。使用p。訪問您的數組元素p[i][j],它應該工作。

事實上,我會擺脫ptr完全並通過以下方式

int (*p)[COL] = malloc(ROW * sizeof *p); 

而且做的內存分配,因爲尺寸在編譯時已知,實際上你可以將它分配爲

int (*p)[ROW][COL] = malloc(sizeof *p); 

但在這種情況下,您將不得不記住要訪問陣列(*p)[i][j](注意*)。選擇你喜歡的任何一種方法。

+0

Kudos! *優秀*回覆! – paulsm4

0

試試這個:

#define ROW 3 
#define COL 2 

int main() 
{ 
    int *ptr = (int*)malloc(ROW*COL* sizeof(int)); 

    int *p[COL]; 
    int i, j; 

    fot (i = 0; i < COL; i++) 
     p[i] = ptr + ROW * i; 

    for(i = 0; i < ROW; ++i) 
     for(j = 0; j < COL; ++j) 
      scanf("%d", &p[i][j]); 

    for(i = 0; i < ROW; ++i) 
    { 
      for(j = 0; j < COL; ++j) 
        printf("%d ", p[i][j]); 
      printf("\n"); 
    } 

    free(ptr); 
    return 0; 
} 
+0

呃...你試圖通過一個完全未初始化的指針'p'訪問'p [i]'。這隻會導致崩潰(最好)。 – AnT

+0

我正在初始化第一個循環中的指針'p'數組 –

+0

您不能初始化任何東西,因爲您還沒有數組。你'p'被聲明爲int(* p)[COL]'。這個聲明創建一個指向數組*的指針*(不正確地認爲是「數組或指針」)。該指針未初始化,即指向無處。而你正試圖將'[]'運算符應用於指向無處的指針。正如我上面所說,這將無望地崩潰。嘗試一下。 – AnT