2013-05-29 152 views
-3

我需要爲分配二維數組定義函數,但它應該只調用malloc一次。在C中有一個malloc的二維數組分配函數

我知道如何分配它(-std = C99):

int (*p)[cols] = malloc (sizeof(*p) * rows); 

但我無法弄清楚如何從函數返回。返回不是選項,因爲一旦函數結束(或至少部分),數組將停止存在。因此,只有將數組傳遞給此函數的選項與參數類似,但上面的解決方案需要在聲明中定義col數。它甚至有可能嗎?

謝謝。

由於用戶kotlomoy我設法解決這個問題是這樣的:

... 
#define COLS 10 
#define ROWS 5 

int (*Alloc2D())[COLS] 
{ 
    int (*p)[COLS] = malloc(sizeof(*p) * ROWS); 
    return p; 
} 

//and this is example how to use it, its not elegant, 
//but i was just learning what is possible with C 

int main(int argc, char **argv) 
{ 
    int (*p)[COLS] = Alloc2D(); 
    for (int i = 0; i < ROWS; i++) 
     for(int j = 0; j < COLS; j++) 
      p[i][j] = j; 

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

    return 0; 
} 
+0

你真的應該加上' c99'標籤 – kotlomoy

回答

0
int * Alloc2D(int rows, int cols) 
{ 
    return malloc(sizeof(int) * rows * cols); 
} 

用法。

要分配:

int * array = Alloc2D(rows, cols); 

要獲得元素[I,J]:

array[ cols * i + j ] 

而且不要忘了清理內存:

free(array); 
+1

這是一維數組... –

+0

從技術上講,C中沒有二維數組......甚至是'int array [3] [4]'不是2D陣列。它是一維數組的一維數組。但是你不能動態地使用這樣的數組。我只給你一個'malloc'解決方案。另一種解決方案是將指針數組分配給行,然後分配循環中的每一行。 – kotlomoy

+0

由2d一個平均數組,它可以用[] []索引,這是我的第一行代碼能夠... 1D數組的一維數組 - 是的,但最終它的行爲像2D數組 –