传递可变大小的多维数组
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
我正在尝试了解 "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