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

问题描述 投票:0回答:3

睡了一夜后编辑

此代码有效

#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 function pointers
3个回答
0
投票

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

0
投票

函数返回指向二维数组的指针

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

0
投票
  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. 大小是未知的编译时间(VLAs): 不幸的是,只有 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);
}
© www.soinside.com 2019 - 2024. All rights reserved.