我试图理解将多维数组传递给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? */
}
还有一点点 扑朔迷离 这将只作为功能原型
void printArry(int a, int b, int arr[*][*]);
这不是一个真正的答案,而是对OP的评论问题的扩展评论,“你可以在不知道行数的情况下传递数组,但是你怎么知道何时停止打印行?”
答:一般情况下,你不能没有通过数组大小。看看这个1-D示例,它打破了数组大小。
#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