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



我想创建一个C函数,它以二维双精度数组为参数,并通过索引对该数组进行操作,例如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");
    }
}

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

然而,当我尝试将一个数组初始化为一些给定的值,然后调用:

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

我遇到了以下错误:

Unhandled exception at 0x011514D3 in Example.exe: 0xC0000005:
Access violation reading location 0xA1F8E3AC.

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

请注意,为了函数定义的目的,我将在运行时知道数组的大小,而不是编译时。此外,我正在用VisualStudio 2013在Windows上编译。

double a[5][6]的类型为double[][6],与double**不同。double**是指向double类型指针的指针。double[][6]是一个由编译器管理的数据类型,表示一个二维数组。

这里发生的事情是,您创建的double[][6]在调用printArray时被静默地转换为double**

如果你的函数要接受一个double**,你需要传递它一个double**。您可以通过单独填充每个成员数组来初始化数组内容:

<>之前Double row1[3] = {3,4,5};A [1] = row1;之前

这解决了这个问题;由于double[]被编译器存储为double值的连续数组,因此像上面那样将其隐式转换为double*是安全的。

另一个解决方案是将函数更改为"真正的"double[][6],而不是指针-指针。对于非固定大小的数组,如何做到这一点取决于您的特定品牌的C;据我所知,它不是C标准的一部分。

第三种解决方案是用malloc一行一行地构建数组,然后用a[0][0] = 1一个单元格一个单元格地填充,以此类推。你已经在你的问题中有这个了,它可以正常工作。

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

相关内容

  • 没有找到相关文章