将数组传递给C中的递归函数

时间:2017-11-23 18:42:08

标签: c arrays recursion

我写这个来执行洪水填充,这里有两个问题: 1-i需要从用户那里获得length,如何将未知长度的数组传递给函数? 2 - 我应该更改在函数内调用floodfill的参数吗?

#include <stdio.h>

int main() {
    const int length = 9;
    int board[length][length],sheet[length][length];
    int i=1,j=1;
    floodfill(board,sheet,i,j);
    return 0;
}

void floodfill(int board[length][length],int sheet[length][length], int i,int j){

    if(board[i][j]!=-1)
    {
        sheet[i][j]= 1;
        if(i-1>0 && j>0)
            floodfill(board, sheet, i-1,j);
        if(i+1>0 && j>0)
            floodfill(board, sheet, i+1,j);
        if(i>0 && j+1>0)
            floodfill(board, sheet, i,j+1);
        if(i>0 && j-1>0)
            floodfill(board, sheet, i,j-1);
    }
}

1 个答案:

答案 0 :(得分:0)

  

如何将未知长度的数组传递给函数?

如果您的编译器支持可变长度数组(VLA),这对于大多数现代编译器都是如此,因为C99标准需要它并且在当前(C11)标准中,它们是可选功能,可以这样传递:

void example(size_t rows, size_t cols, int array[][cols])

因此,在引用之前的参数时,首先传递维度,然后传递(指向)数组。请注意,您必须提供除第一个之外的所有维度。

当然,如果两个维度相同,您只需要一个参数,就像您的情况一样:

void example(size_t length, int array[][length])

如果您不能使用VLA,因为您的编译器确实缺乏支持,那么您最好的选择是使用 flat 数组(此处大小为rows * cols)并计算索引。使用这样的函数:

void example(size_t rows, size_t cols, int *array)

您必须在主代码中动态分配数组,例如像这样:

int *array = malloc(rows * cols * sizeof *array);

然后您将手动访问元素,例如如果你想索引[i][j],你可以写:

array[i * cols + j]