2016-09-28 119 views
1

也許我的問題是容易的,但我很牛逼的C.Ç - 函數返回二維數組

我創建從一個文件,然後讀取數據的函數將其傳遞到解析他們給出數的另一個功能行和列,並創建一個2D數組。

我想返回這個數組,以便在其行中執行一些操作。我怎麼能返回一個二維陣列在C

有人可以給我一個例子,或者我做了什麼錯?

問候

+0

@ M.SChaudhari謝謝。我問之前閱讀它,但仍然困惑!任何幫助? –

+2

是不是http://stackoverflow.com/a/14088911/3684343正是你想要的答案?如果你沒有向我們展示你的代碼,我們也不能說你做錯了什麼。 – mch

回答

1

當心,在C返回數組是一個初學者的陷阱,因爲它是高度依賴於存儲時間:

  • 靜態或全局:沒問題,但內容將在明年被覆蓋請致電
  • 自動:永遠不要這樣做!實際返回的是懸掛指針,因爲數組的生命期結束於返回語句的末尾
  • dynamic(malloc-ed):好的,但調用者必須稍後釋放它。

更習慣的方式是調用者傳遞它擁有的數組以及它的大小。

0

無論函數的結果是一維還是兩維,都無法返回數組。您可以返回一個指向數組的第一個元素的指針。另外,嚴格來說,C中沒有二維數組。最接近它的是包含另一個數組作爲元素的數組。即定義如下:

int twoDimArray[2][3]; 

如果這樣的數組的維度是動態確定的,您不能在文件範圍內定義它。你可以使用一些函數在本地定義它。這樣一個數組將是一個局部變量,將被存儲在系統堆棧中,並在控制離開該函數時消失。就我個人而言,我會使用這種模式。即像一個代碼:

int main() { 
    int rows, cols; 
    ... 
    getDimensions(&rows, &cols); 
    // definition with dynamic dimensions in function scope is O.K. 
    int a[rows][cols]; 
    init(rows, cols, a); 
    proceed(rows, cols, a); 
    ... 
} 

其中init函數可以像定義:

void init(int rows, int cols, int a[rows][cols]) { 
    int i,j; 
    for(i=0; i<rows; i++) { 
     for(j=0; j<cols; j++) { 
      a[i][j] = i*100+j; 
     } 
    } 
} 

如果這樣的圖案不能用(數組太大和您的系統堆棧太小例如),我會用:

int main() { 
    int rows, cols; 
    getDimensions(&rows, &cols); 
    int (*a)[cols] = malloc(sizeof(int [rows][cols])); 
    init(rows, cols, a); 
    proceed(rows, cols, a); 
    free(a); 
} 

如果你堅持這樣返回數組功能我會使用空指針:

void *allocate2DintArray(int rows, int cols) { 
    return(malloc(sizeof(int [rows][cols]))); 
} 

void *allocateAndInit(int rows, int cols) { 
    int i,j; 
    int (*a)[cols] = allocate2DintArray(rows, cols); 
    for(i=0; i<rows; i++) { 
     for(j=0; j<cols; j++) { 
      a[i][j] = i*100+j; 
     } 
    } 
    return(&a[0][0]); 
} 

int main() { 
    int rows, cols; 
    ... 
    getDimensions(&rows, &cols); 
    int (*a)[cols] = allocateAndInit(rows, cols); 
    proceed(rows, cols, a); 
    ... 
    free(a); 
}