- 一夜安眠后编辑**
此代码有效
#include <stdlib.h>
#define MAX_X 5
#define MAX_Y 6
void main ( void ){
int i,j,k;
double *aux;
double *MM[MAX_X][MAX_Y];
// Populate MM
for (i = 0; i < MAX_X; i++)
for (j = 0; j < MAX_Y; j++ ){
aux = calloc (100,sizeof(double));
if (aux != NULL)
for (k = 0; k < 100; k++)
aux[k] = 10.0 * (i + j + k);
MM[i][j] = aux;
}
// do something
// Free MM
for (i = 0; i < MAX_X; i++)
for (j = 0; j < MAX_Y; j++ ){
if (MM[i][j] != NULL)
free (MM[i][j]);
}
}
我想要的是:
#include <stdlib.h>
#define MAX_X 5
#define MAX_Y 6
double *[][] calc_MM ( void ){
double *MM[MAX_X][MAX_Y];
for (i = 0; i < MAX_X; i++)
for (j = 0; j < MAX_Y; j++ ){
aux = calloc (100,sizeof(double));
if (aux != NULL)
for (k = 0; k < 100; k++)
aux[k] = 10.0 * (i + j + k);
MM[i][j] = aux;
}
return MM;
}
void free_MM ( double *MM[MAX_X][MAX_Y] ){
int i,j;
for (i = 0; i < MAX_X; i++)
for (j = 0; j < MAX_Y; j++ ){
if (MM[i][j] != NULL)
free (MM[i][j]);
}
}
void main ( void ){
int i,j,k;
double *aux;
double *MM[MAX_X][MAX_Y];
// Populate MM
MM = calc_MM ();
// do something
// Free MM
free_MM ( MM );
}
我应该定义什么类型才能传递MM并从函数返回它?double *MM[MAX_X][MAX_Y];
- 老问题**我有一个运行良好的代码
double *foo (int i, int j){
double *aux;
do something
return aux;
}
void main (void){
double *MM[MAX_X][MAX_Y];
..
..
// Calc as MM
for (i = 0; i < MAX_X; i++)
for (j = 0; j < MAX_Y; j++ )
MM[i][j] = foo (i,j);
}
我想把这个循环放进一个函数里。
double *foo (int i, int j){
double *aux;
do something
return aux;
}
double ***calc_MM ( some input ) {
int i,j;
double ***MM;
for (i = 0; i < MAX_X; i++)
for (j = 0; j < MAX_Y; j++ )
MM[i][j] = foo (i,j);
return MM;
}
void main (void){
double *MM[MAX_X][MAX_Y];
..
..
// Calc as MM
MM = calc_MM ( some input )
}
MAX_X和MAX_Y是#define常量,稍后将从envp读取
对不起,如果我不清楚,但我必须使用MM,它会变得更加模块化,如果我可以传递和返回它从一个函数。
我需要一些关于如何定义double *MM[MAX_X][MAX_Y];
的帮助,以便从函数传递和返回它。
我尝试了一些 * 和const * 等的组合,但总是有编译器错误。
Returning `double * (*)[35]` from a function with incompatible return type `double ** const*` [-Werror=incompatible-pointer-types].
我想这一个可能回答了我的问题,但我不明白Designating a pointer to a 2D array
3条答案
按热度按时间bq3bfh9z1#
对于符合C标准的启动器,不带参数的函数main应声明如下
其中函数calc_MM的调用方式如下
那么无论如何这句话
无效,因为数组没有赋值运算符。
然而,如果你想返回一个指向数组第一个元素的指针,那么函数声明看起来就像
bcs8qyzn2#
函数返回指向二维数组的指针
foo()
返回一个指向2-D数组的指针。然而OP所要求的可能不满足其他编码目标。@0_____________评论“它无法在下次调用时返回另一个不同的值”。提供这样的函数很简单。
jmp7cifd3#
1.如果编译时大小已知:
1.大小在编译时未知(VLA):遗憾的是,只有void指针可以用作返回值,或者您可以将指针传递给数组指针