传递可变大小的多维数组

我试图理解将多维数组传递给c中的函数的“最佳实践”(或实际上是任何实践)是什么。 当然这取决于应用程序,因此我们考虑编写一个函数来打印可变大小的2D数组。 特别是,我对如何在下面的代码中编写函数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? */ } 

并且有点令人困惑 ,它只能作为function原型

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

这不是一个真正的答案,而是对OP的评论问题的扩展评论,“你可以在不知道行数的情况下传递数组,但是你怎么知道何时停止打印行?”

答:一般情况下,你不能没有通过数组大小。 看看这个1-D示例,它打破了数组大小。

 #include  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不提供任何arrays溢出保护,除了arrays定义初始化器(尽管这样的初始化器可以定义arrays长度)。 您也必须传递数组大小,如

 #include  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