为什么我们不能将动态数组用作使用静态数组参数的函数的参数?

时间:2017-09-06 00:03:05

标签: c arrays data-structures

我正在研究C语言和数据结构。我想详细解释为什么我们不能使用动态数组作为使用静态数组参数的函数的参数。

#include <stdio.h>

int sumAry2D_f1(int ary[][3], int rows, int cols);
void freeAry2D(int **ary, int rows);

int main(void)
{
    int ary2D[][3] = { {1, 2, 3}, {4, 5, 6} }; // static array

    int r, c;
    int **ary = (int**)malloc(sizeof(int*) * 2); // dynamic array
    for (r = 0; r < 2; r++)
    ary[r] = (int*)malloc(sizeof(int)*3);

    for (r = 0; r < 2; r++)
        for (c = 0; c < 3; c++)
            ary[r][c] = r + c; // 0, 1, 2, 1, 2, 3

    printf("sumAry2D_f1() %d\n", sumAry2D_f1(ary2D, 2, 3));

    // why we can`t function like this?
    // printf("sumAry2D_f1~3() %d\n", sumAry2D_f1(ary, 2, 3));

    freeAry2D(ary, 2); // free function of dynamic array

    return 0;
}

int sumAry2D_f1(int ary[][3], int rows, int cols)
{
    int i, j, sum = 0;

    for (i = 0; i < rows; i++)
        for (j = 0; j < cols; j++)
            sum += ary[i][j];

    return sum;
}

void freeAry2D(int **ary, int rows)
{
    int i;

    for (i = 0; i < rows; i++)
    free(ary[i]);
    free(ary);
}

1 个答案:

答案 0 :(得分:0)

 // why we can`t function like this?
 // printf("sumAry2D_f1~3() %d\n", sumAry2D_f1(ary, 2, 3));

您的函数特别期望指向指向3个整数序列的整数指针的指针,或3个元素整数数组的数组,而不仅仅是指向整数指针的指针。 ary只是指向整数指针的指针。虽然您使int **具有与int [][3]相同的结构,但它可能不同,编译器无法分辨,因为内存分配在运行时发生,因此如果您取消注释代码它可能不会编译,即使它确实行为将是未定义的。

不幸的是,您需要2个功能来执行您想要的操作:

int sumAry2D_f1(int ary[][3], int rows, int cols);

int sumAry2D_f12(int** ary, int rows, int cols);

每个函数内的代码都是一样的。