2016-03-06 161 views
3

我的目標是分配一個2d數組,僅使用1行來提高效率。因爲我的教授期待它的效率。 該代碼給我一個錯誤,說它無法從void *轉換爲int。分配一個二維數組

#include<stdio.h> 
#include<stdlib.h> 

#define NUMOFCOL 4 

int **addtwoarr(int (*A)[NUMOFCOL], int (*B)[NUMOFCOL]); 

int main(void){ 
    int firstarr[4][4]={{1,1,1,1}, 
         {1,1,1,1}, 
         {1,1,1,1}, 
         {1,1,1,1}}, 
     secondarr[4][4]={{1,1,1,1}, 
         {1,1,1,1}, 
         {1,1,1,1}, 
         {1,1,1,1}}, **receiver; 
    receiver = addtwoarr(firstarr, secondarr); 
    printf("%d", receiver[3][3]); 
} 

int **addtwoarr(int (*A)[NUMOFCOL], int (*B)[NUMOFCOL]){ 
    int col, row, **arr; 
    (*arr)[NUMOFCOL] = malloc(NUMOFCOL * sizeof(*arr)); /*this line in particular gives the error */ 
    for(row=0; row<NUMOFCOL; row++){ 
     for(col=0;col<NUMOFCOL; arr[row][col]=A[row][col]+B[row][col], col++){} 
    } 
    return arr; 
} 

分配發生在addtwoarr函數,它是其中所述錯誤發生。

+1

'(* arr)[NUMOFCOL] = ...'??那麼,'arr'最好指向那條線之前的東西。其餘的看起來像是猜測。 – WhozCraig

+0

靜態初始化怎麼樣?根本不需要運行時。 – Downvoter

+0

啊。我見過人們int(* m)[CCOLS] = malloc(cRows * sizeof(* m)); 但我不能得到那部分權利。 – Joshua

回答

2

我認真不建議這樣做,因爲在代碼中有很多關於頂端尺寸的假設。但如果你真的想這樣做,在C返回指針固定長度數組相當晦澀的語法看起來是這樣的:

#include <stdio.h> 
#include <stdlib.h> 

#define NUMOFCOL 4 

int (*addtwoarr(int A[][NUMOFCOL], int B[][NUMOFCOL]))[NUMOFCOL]; 

int main(void) 
{ 
    int firstarr[][NUMOFCOL] = { 
     {1,1,1,1}, 
     {1,1,1,1}, 
     {1,1,1,1}, 
     {1,1,1,1}}, 

    secondarr[][NUMOFCOL] = { 
     {1,1,1,1}, 
     {1,1,1,1}, 
     {1,1,1,1}, 
     {1,1,1,1}}; 

    int (*receiver)[NUMOFCOL] = addtwoarr(firstarr, secondarr); 
    printf("%d\n", receiver[3][3]); 
    free(receiver); 
} 

int (*addtwoarr(int A[][NUMOFCOL], int B[][NUMOFCOL]))[NUMOFCOL] 
{ 
    int col, row; 
    int (*arr)[NUMOFCOL] = malloc(NUMOFCOL * sizeof(*arr)); 
    for(row=0; row<NUMOFCOL; row++){ 
     for(col=0;col<NUMOFCOL; arr[row][col]=A[row][col]+B[row][col], col++); 
    } 
    return arr; 
} 

輸出

2 

好運。

+0

它給我一個錯誤 「23 \t \t 55 C:\的Fraps \ Addmatrix.cpp \t [錯誤]從 '無效*' 到 'INT(*)[4]'[-fpermissive]無效的轉換」 「27 C:\ Fraps \ Addmatrix.cpp \t [錯誤]無法將int(*)[4]'轉換爲'int **'作爲回報​​「。 (我使用dev-c,因爲我的教授告訴我使用它。) 但謝謝!這是我的錯誤。我真的忘了解放它。 – Joshua

+0

很抱歉聽到這個消息。 [在這裏**運行正確**](http://ideone.com/esKGpS)。由於我發佈的代碼中沒有單獨的'int **',所以可能考慮*所有*而不僅僅是它的一部分。注意,原型和實現中的返回值類型也發生了變化(必須)。當然,確保你編譯爲C,而不是C++。 – WhozCraig

+0

哦,我的!它確實運行正常。我沒有把它當作C。抱歉。代碼完美運行。但是,我可以問一下,如果還有另一種方式讓int運行(* addtwoarr(int A [] [NUMOFCOL],int B [] [NUMOFCOL]))[NUMOFCOL] 作爲參數。 – Joshua