如何将2D动态分配的数组传递给函数?

时间:2010-08-05 12:55:27

标签: c pointers multidimensional-array

我的函数main中有一个在我的C代码中动态分配的二维数组。我需要将这个2D数组传递给一个函数。由于数组的列和行是运行时变量,我知道传递它的一种方法是:

- 通过行和列变量以及指向数组的[0] [0]元素的指针

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

然后在被调用函数中,将其作为'flattened out'一维数组访问,如:

ptr[i*cols+j]

但是我不想这样做,因为这意味着代码会发生很多变化,因为早先,传递给这个函数的2D数组是静态分配的,其编码时已知其维度。

那么,我如何将2D数组传递给函数,并且仍然能够将其用作具有2个索引的2D数组,如下所示?

arr[i][j].

任何帮助将不胜感激。

7 个答案:

答案 0 :(得分:7)

#include <stdio.h>
#include <stdlib.h>
void doit(int ** s , int row , int col ) 
{
    for(int i =0 ; i <col;i++){
            for(int j =0 ; j <col;j++)
                printf("%d ",s[i][j]);
            printf("\n");
    }
}
int main()
{
    int row =10 , col=10;
    int ** c = (int**)malloc(sizeof(int*)*row);
    for(int i =0 ; i <col;i++)
        *(c+i) = (int*)malloc(sizeof(int)*row);
    for(int i =0 ; i <col;i++)
            for(int j =0 ; j <col;j++)
                c[i][j]=i*j;
    doit(c,row,col);
}

希望这是你想要的方式......

答案 1 :(得分:2)

如果您的编译器支持C99可变长度数组(例如GCC),那么您可以声明一个如下函数:

int foo(int cols, int rows, int a[][cols])
{
    /* ... */
}

您还可以在调用代码中使用指向VLA类型的指针:

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

答案 2 :(得分:1)

如果不改变很多代码,你真的不能这样做。我建议将其包含在包含限制的结构中,然后使用regexp search'n'replace来修复访问。

也许使用像AA(arr,i,j)这样的宏(如在Array Access中那样)arr是结构。

答案 3 :(得分:1)

据我所知,你可以传递给函数的只是一个指向数组第一个元素的指针。当你将一个实际的数组传递给一个函数时,就会说“数组衰减成一个指针”,所以没有关于指向数组大小的信息。

  

对表达式中出现的array-of-T类型的对象的引用将表达式(有三个例外)衰减为指向其第一个元素的指针;结果指针的类型是指向T的指针。

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

答案 4 :(得分:0)

Numerical recipes in C(一本主要涉及矩阵的书)提出了一种干净利落地处理二维矩阵的方法。查看1.2“矩阵和二维数组”部分以及方法convert_matrix()

基本上你需要的是分配一组指针指向你的行向量。并将其传递给您的函数以及行数和列数。

答案 5 :(得分:0)

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

答案 6 :(得分: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;
    }