2016-03-06 131 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