C语言 函数返回指向二维数组的指针(指针)

lbsnaicq  于 2023-03-01  发布在  其他
关注(0)|答案(3)|浏览(157)
    • 一夜安眠后编辑**

此代码有效

#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

bq3bfh9z

bq3bfh9z1#

对于符合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];
bcs8qyzn

bcs8qyzn2#

函数返回指向二维数组的指针
foo()返回一个指向2-D数组的指针。然而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;
}
jmp7cifd

jmp7cifd3#

1.如果编译时大小已知:

#define MAX_ROW 5 
#define MAX_COL 6

double (*compileTimeConst(void))[MAX_ROW][MAX_COL]
{
    return malloc(sizeof(double[MAX_ROW][MAX_COL]));
}

1.大小在编译时未知(VLA):遗憾的是,只有void指针可以用作返回值,或者您可以将指针传递给数组指针

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);
}

相关问题