2013-06-21 23 views
1

我想將使用malloc定義的2d數組傳遞給函數。 首先我使用blog post的代碼定義數組。如何使用malloc定義2d數組並將其傳遞給函數

int** Make2DIntArray(int arraySizeX, int arraySizeY) { 
    int** theArray; 
    theArray = (int**) malloc(arraySizeX*sizeof(int*)); 
    for (int i = 0; i < arraySizeX; i++) 
     theArray[i] = (int*) malloc(arraySizeY*sizeof(int)); 
     return theArray; 
    } 

int main(){ 

int** myArray = Make2DIntArray(nx, ny); 

} 

我可以用它作爲myArray [i] [j]。 在那之後,我想通過這個數組的function.I試圖通過這樣的:

function(myArray); //function call 

//function 

void function(int myArray[][]){ 
//function code goes here 
} 

但這wrong.The問題是,數組的大小是不同的每再寄一次也試圖定義的最大尺寸爲陣列的列,並使用它是這樣的:

#define COLUMNMAX 100 

function(myArray); //function call 

    //function 

    void function(int myArray[][COLUMNMAX]){ 
    //function code goes here 
    } 

,但我得到了錯誤:

type of formal parameter 1 is incomplete.How can i pass it?

+1

[閱讀](http://c-faq.com/aryptr/aryptr2.html) – 2013-06-21 13:16:21

回答

2

的參數是一個int**

而且你不必強制轉換malloc的返回,只是檢查,如果它不是空

但既然你用malloc不使用免費的,當你不需要它了

0

你用Create2DIntArray做什麼不是一個真正的二維數組。它只是一個指針數組,每個指向內存中的某個地方。並且每一塊內存分別分開撥打malloc(順便說一下,別忘了free吧)。所以基本上沒有任何保證,有些位被分配給int myArray[][]。我想,將數據作爲二維數組傳遞的唯一方法是創建一個真正的二維數組,然後用數據重新填充數據。

+0

你是說沒有辦法通過上述指針數組? – Dchris

+0

將指針數組作爲'int **'傳遞是沒有問題的。但不是'int [] []'。這些是完全不同的數據結構。 – akalenuk

+0

int [] []是有效的語法,akelenuk。這與傳遞** int相同。 – Nathan

2

myArray界限是不知道的,所以你應該改變void function(int myArray[][]){void function(int **myArray){

不要讓typecasting of malloc

1

C標準支持變長數組,這樣你就不會需要分配,分配或使用額外的指針。只需指定所需的尺寸,如下所示。

分配N列的M行的陣列是這樣的:

int (*array)[N] = malloc(M * sizeof *array); 

聲明其接收到這樣的陣列這樣的功能:

void function(size_t M, size_t N, int array[][N]); 

陣列傳遞給這樣的功能:

function(M, N, array); 
0

擺脫你的「正式參數類型1是不完整的。」錯誤,你使用它(向前聲明)之前,你應該聲明你的函數:

void functionB(int **myArray); //forward declaration 

void functionA() { 
    functionB(blaaaa);   //usage 
} 

void functionB(int **myArray) { 
    //implementation 
} 
0

它看起來像你需要在這裏什麼是陣列中的行和列的大小一些預訂信息。有多種方法可以做到這一點,但這裏有四個)

1)如果你知道在編譯時的大小,你可以使用一個定義就像你試圖這樣做。定義是全局範圍的,你可以在文件中的所有函數中訪問它們。而不是以某種方式嘗試傳遞定義的值(如COLUMN_SIZE),只需將其用作「函數」函數內的for循環結束條件即可。但是,如果您在編譯時間之前知道大小,則可以簡單地創建一個固定大小的數組。 Malloc通常用於動態運行時確定的內存分配。 2)簡單地將nx和ny的值存儲在main中,並使其成爲「function」接受3個參數:(int [] [] my_array,column_size,row_size),並將它的指針傳遞給數組,作爲數組的以及nx和ny。這比方法1更可取,因爲它允許在運行時指定數組大小,而不是在編譯期間指定數組大小。

3)這是一個我會建議:使用一個結構,這樣

struct 2d_array{ 
    int row_size; 
    int column_size; 
    int** actual_array; 
    } 

有了這個,你有幾種選擇。因此,它返回無論是2d_array結構或指針2d_array結構(取決於如果你想通過引用來處理與傳遞的結構或按值傳遞。)您可以編輯Make2dIntArray。或者你可以擁有它,這樣你就可以構建主結構。我建議讓Make2dIntArray返回結構,它會非常乾淨。

然後,你可以讓你的「函數」函數簡單地採用2d_array結構作爲它的參數(再次,無論是作爲指針還是非指針,取決於是否要更改row_size和column_size變量,而我不能看到任何目的,除非你是remalloc actual_array)。然後,您只需訪問「function」內部結構中的row_size和column_size變量,即可獲得所需的全部信息。

基本上,這背後的整個想法是記賬。跟蹤您需要的信息,並在需要時輕鬆訪問。

+0

這個答案忽略了C標準支持變長數組的事實,所以你可以簡單地聲明在運行時的尺寸。函數參數甚至可以是一個指針指向一個可變長度數組,與所述尺寸從先前參數來(不是如此答案所示,在以後的參數中指定的尺寸)。 –

相關問題