如何将二维动态分配的数组传递给函数?

6

我在C代码的主函数中动态分配了一个二维数组。我需要将这个二维数组传递到一个函数中。由于数组的列和行是运行时变量,我知道一种传递方式是:

- 传递行和列变量以及指向数组 [0][0] 元素的指针。

myfunc(&arr[0][0],rows,cols)

然后在被调用的函数中,可以将其视为一个“扁平化”的一维数组来访问:

ptr[i*cols+j]

但我不想那样做,因为那将意味着代码需要很多的更改,因为早些时候,传递给该函数的二维数组是在编译时已知其维度的静态分配。

那么,如何传递一个二维数组给函数,并仍然能够像以下这样使用它作为具有2个索引的二维数组?

arr[i][j].

非常感谢您的帮助。

7个回答

6
请看下面的代码。在将2D数组基地址作为双指针传递给myfunc()后,您可以通过索引访问数组中的任何特定元素,如s[i][j]
#include <stdio.h>
#include <stdlib.h>

void myfunc(int ** s, int row, int col) 
{
    for(int i=0; i<row; i++) {
        for(int j=0; j<col; j++)
            printf("%d ", s[i][j]);
        printf("\n");
    }
}

int main(void)
{
    int row=10, col=10;
    int ** c = (int**)malloc(sizeof(int*)*row);
    for(int i=0; i<row; i++)
        *(c+i) = (int*)malloc(sizeof(int)*col);
    for(int i=0; i<row; i++)
        for(int j=0; j<col; j++)
            c[i][j]=i*j;
    myfunc(c,row,col);
    for (i=0; i<row; i++) {
        free(c[i]);
    }
    free(c);
    return 0;
}

这就是它——尽管代码在内存分配部分有轻微的错误… 但是已经掌握了要点。 - goldenmean

2
如果您的编译器支持C99变长数组(例如GCC),则可以这样声明函数:
int foo(int cols, int rows, int a[][cols])
{
    /* ... */
}

在调用代码中,您还需要使用指向VLA类型的指针:

int (*a)[cols] = calloc(rows, sizeof *a);
/* ... */
foo(cols, rows, a);

1
你真的不能在不改变许多代码的情况下完成这个任务。我建议将其包装在一个包含限制的结构中,然后使用正则表达式搜索和替换来修复访问。
也许可以使用类似于AA(arr,i,j)(即数组访问)的宏,其中arr是该结构体的名称。

所以基本上你的意思是——没有编程方法可以完成它,只能使用“搜索和替换”吗?是这样吗? - goldenmean

1
据我所知,你可以传递给函数的只有指向数组第一个元素的指针。当你将一个实际的数组传递给一个函数时,就会说“数组退化成为指针”,因此指向的数组大小信息就不再存在。

表达式中出现的类型为“T数组”的对象引用(有三个例外)会退化为指向其第一个元素的指针;结果指针的类型是指向T的指针。

我相信您可以在C FAQ上找到更多相关信息。

0
在C中,一个二维数组只是一个数组的数组。给你看看:

在C中,一个二维数组只是一个数组的数组。给你看看:

void with_matrix(int **matrix, int rows, int cols) {
    int some_value = matrix[2][4];
}

int main(int argc, char **argv) {
    int **matrix;
    ... create matrix ...
    with_matrix(matrix, rows, cols);
}

0

C语言数值计算(主要涉及矩阵)提供了一种干净而且仍然处理2D矩阵的方法。请查看 1.2 节“矩阵和2D数组”以及 convert_matrix() 方法。

基本上,您需要分配一组指针来指向行向量,并将其与行数和列数一起传递给函数。


0
int cols = 4;
    int rows = 3;
    char** charArray = new char*[rows];
    for (int i = 0; i < rows; ++i) {
        charArray[i] = new char[cols];
    }

    // Fill the array
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            charArray[i][j] = 'a';
        }
    }

    // Output the array
    for (int i = 0; i < rows; ++i) {
        for (int j = 0; j < cols; ++j) {
            cout << charArray[i][j];
        }
        cout << endl;
    }

请提供更多关于你所尝试做的事情的信息。 - Krish Munot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接