如何从函数中返回矩阵(2D数组)? (C)

我创建了一个生成宾果板的function,我想要返回宾果板。

正如我没想到的那样,它不起作用。

这是function:

int** generateBoard() { int board[N][M], i, j , fillNum; Boolean exists = True; // initilize seed srand(time(NULL)); // fill up.. for(i = 0; i < N; ++i) { for(j = 0; j < M; ++j) { exists = True; while(exists) { fillNum = rand()%MAX_RANGE + 1; // limit up to MAX_RANGE if(beenAdded(board, fillNum) == Exist) { continue; } else { board[i][j] = fillNum; exists = False; } } } } return board; } 

我在“返回板”行有一个compilcation错误(红色子行)。

没有使用结构\动态分配返回2D数组的方法?

我正在使用Microsoft Visual C ++ Express 2010。

有人必须在某处拥有该板的内存,更重要的是,所有权必须延伸回此函数的调用者。 如果没有动态分配,您唯一的其他替代方法是将其发送到函数中,如in / out参数。

 void generateBoard(size_t N, size_t M, int board[N][M]) { int i, j , fillNum; Boolean exists = True; // initilize seed srand(time(NULL)); // fill up.. for(i = 0; i < N; ++i) { for(j = 0; j < M; ++j) { exists = True; while(exists) { fillNum = rand()%MAX_RANGE + 1; // limit up to MAX_RANGE if(beenAdded(board, fillNum) == Exist) { continue; } else { board[i][j] = fillNum; exists = False; } } } } } 

并从您的调用者调用这样的:

 int main() { const size_t N = 10; const size_t M = 10; int board[N][M]; generateBoard(N,M,board); ... } 

我还会考虑将srand()调用重定位到main()的启动代码。 理想情况下,它应该永远不会出现在一些可能重复调用的函数中,并且应保证每个进程执行时只执行一次 。 (注意:老实说,我不记得每个线程是否执行过一次,但是在你的编码学习曲线的这一点上我猜测multithreading还没有在雷达上)。

最后,你的随机填充循环是不必要的重复。 有更好的选择产生你显然要做的事情:创建一组现有数字的随机排列。 如上所述,您可以旋转一段时间尝试填充最后几个插槽,具体取决于与(N*M)相比多大的MAX_RANGE

您将board定义为局部变量 – 当函数超出范围时,其内存将被处理。

您可以将板声明为全局,或者您可以动态创建它,如下所示:

 int **allocate_board(int Rows, int Cols) { // allocate Rows rows, each row is a pointer to int int **board = (int **)malloc(Rows * sizeof(int *)); int row; // for each row allocate Cols ints for (row = 0; row < Rows; row++) { board[row] = (int *)malloc(Cols * sizeof(int)); } return board; } 

您需要动态释放电路板:

 // you must supply the number of rows void free_board(int **board, int Rows) { int row; // first free each row for (row = 0; row < Rows; row++) { free(board[row]); } // Eventually free the memory of the pointers to the rows free(board); }