睡了一夜后编辑
此代码有效
#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].
我想这个可以回答我的问题,但我不明白 指定一个指向二维数组的指针
对于符合 C 标准的启动器,不带参数的函数 main 应声明为
int main( void )
{
double *MM[MAX_X][MAX_Y];
..
..
// Calc as MM
MM = calc_MM ( some input )
}
调用函数 calc_MM 的地方
calc_MM ( MM )
那么无论如何这个声明
MM = calc_MM ( some input )
无效,因为数组没有赋值运算符。
尽管如此,如果您想返回指向传递数组的第一个元素的指针,那么函数声明将如下所示
double * ( * calc_MM( double *MM[MAX_X][MAX_Y] ) )[MAXY];
函数返回指向二维数组的指针
foo()
返回一个指向二维数组的指针。然而,OP 要求的可能不符合其他编码目标。
#define MAX_X 3
#define MAX_Y 5
double (*foo(void))[MAX_X][MAX_Y] {
static double a[MAX_X][MAX_Y];
return &a;
}
@0____________ 评论说“它不能在下一次调用时返回另一个不同的”。很容易提供一个功能。
#include <stdlib.h>
double (*foo(void))[MAX_X][MAX_Y] {
double (*a)[MAX_X][MAX_Y] = malloc(sizeof *a);
return a;
}
#define MAX_ROW 5
#define MAX_COL 6
double (*compileTimeConst(void))[MAX_ROW][MAX_COL]
{
return malloc(sizeof(double[MAX_ROW][MAX_COL]));
}
void *VLA(size_t MAX_ROW, size_t MAX_COL, double (**array)[MAX_COL])
{
double (*m)[MAX_COL] = malloc(MAX_ROW * sizeof(**array));
if(array) *array = m;
return m;
}
void caller(size_t MAX_ROW, size_t MAX_COL)
{
double (*array)[MAX_COL] = VLA(100, 200, NULL);
double (*array1)[MAX_COL];
VLA(100, 200, &array1);
free(array);
free(array1);
}