我需要一个简单的例子,将2D数组传递给C中的函数

Tre*_*kie 3 c arrays function-parameter multidimensional-array

我想创建一个C函数,它将一个二维2D数组作为参数,并通过索引操作该数组,例如printf("%f ", array[i][j]).

我从各种例子和SO问题拼凑起来的是这样的:

void printArray(double **array, int m, int n)
{
    int i, j;
    for (i = 0; i < m; i++) 
    {
        for (j = 0; j < n; j++) 
        {
             printf("%f ", array[i][j]);
        }
    printf("\n");
    }
}
Run Code Online (Sandbox Code Playgroud)

main,我能够像这样成功打印数组:

int i, j, k = 0, m = 5, n = 6;
double **a = malloc(m * sizeof(*a));

//Initialize the arrays
for (i = 0; i < m; i++) 
{
    a[i] = malloc(n * sizeof(*(a[i])));
}
for (i = 0; i < m; i++) 
{
    for (j = 0; j<n; j++) 
    {
        k++;
        a[i][j] = k;
    }
}

printArray(a, m, n);
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试将数组初始化为某些给定值然后调用:

double a[5][6] = { { 1, 2, 3, 4, 5 ,6},
                   { 1, 2, 3, 4, 5, 6},
                   { 1, 2, 3, 4, 5, 6},
                   { 1, 2, 3, 4, 5, 6},
                   { 1, 2, 3, 4, 5, 6} };

printArray(a, 5, 6);
Run Code Online (Sandbox Code Playgroud)

我遇到以下错误:

Unhandled exception at 0x011514D3 in Example.exe: 0xC0000005:
Access violation reading location 0xA1F8E3AC.
Run Code Online (Sandbox Code Playgroud)

有人可以解释我的错误是什么以及如何解决它?编辑

请注意,出于函数定义的目的,我将在运行时知道数组的大小,但不知道编译时的大小.此外,我正在使用VisualStudio 2013在Windows上进行编译.

Bor*_*lid 5

double a[5][6]有类型double[][6],这是不一样的double**.double**是指向double的指针.double[][6]是一种编译器管理的数据类型,表示二维数组.

这里发生的是double[][6]你创建的是double**在你的调用中默默地转换为a printArray.

如果你的功能是a double**,你需要传递它double**.您可以通过单独填充每个成员数组来初始化数组内容:

double row1[3] = {3, 4, 5};
a[1] = row1;

这解决了这个问题; 因为double[]编译器将其存储为连续的double值数组,所以double*如上所述隐式地将其强制转换是安全的.

另一个解决方案是将函数更改为"real" double[][6]而不是指针指针.你如何使用非固定大小的数组来达到你特定的C品牌; 据我所知,它不是C标准的一部分.

第三种解决方案是逐行构建数组,malloc然后逐个单元格地填充它a[0][0] = 1.您已经在问题中使用了这个,并且它可以正常工作.

最后要注意的是你a在堆栈上进行分配:当你的main函数退出时,访问它将导致未定义的行为.