传递可变大小的多维数组

Passing a multidimensional array of variable size

我正在尝试了解 "best practice"(或任何实践)将多维数组传递给 c 中的函数的意义。当然这取决于应用程序,所以让我们考虑编写一个函数来打印可变大小的二维数组。特别是,我对如何在以下代码中编写函数 printArry(__, int a, int b) 很感兴趣。我省略了第一个参数,因为我不确定它应该是什么。

void printArry(_____, int a, int b){
/* what goes here? */
}


int main(int argc, char** argv){

int a1=5;
int b1=6;
int a2=7;
int a2=8;

int arry1[a1][b1];
int arry2[a2][b2];

/* set values in arrays */

printArry(arry1, a1, b1);
printArry(arry2, a2, b2);

}

最简单的方法是(对于 C99 及更高版本)

void printArry(int a, int b, int arr[a][b]){
    /* what goes here? */
}

但是,还有其他解决方法

void printArry(int a, int b, int arr[][b]){
    /* what goes here? */
}

void printArry(int a, int b, int (*arr)[b]){
    /* what goes here? */
}

编译器会将前两种语法调整为第三种语法。因此,从语义上讲,这三个都是相同的。

还有一点点 confusing 只能作为函数原型使用:

void printArry(int a, int b, int arr[*][*]);

这不是真正的答案,而是对 OP 评论问题的扩展评论,"well you can pass the array without knowing the number of rows with this, but then how will you know when to stop printing rows?"

回答:一般情况下,您不能不传递数组大小。看看这个打破数组大小的一维示例。

#include <stdio.h>

int procarr(int array[16], int index)
{
   return array[index];
}

int main (void)
{
    int arr[16] = {0};
    printf("%d\n", procarr(arr, 100));
    return 0;
}

程序输出(尽管所有元素都初始化为0):

768

那是未定义的行为并且没有编译器警告。 C 不提供任何数组溢出保护,除了数组定义初始化器(尽管这样的初始化器可以定义数组长度)。您也必须传递数组大小,如

#include <stdio.h>

int procarr(int array[16], size_t index, size_t size)
{
    if (index < size)
        return array[index];
    return -1;                  // or other action / flag
}

int main (void)
{
    int arr[16] = {0};
    printf("%d\n", procarr(arr, 100, sizeof arr / sizeof arr[0]));
    return 0;
}

程序输出:

-1