传递可变大小的多维数组
Posted
技术标签:
【中文标题】传递可变大小的多维数组【英文标题】:Passing a multidimensional array of variable size 【发布时间】:2016-04-06 04:19:44 【问题描述】:我试图了解将多维数组传递给 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);
【问题讨论】:
我已经在***.com/questions/34560001/…发布了后续跟进 【参考方案1】:最简单的方法是(对于 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[*][*]);
【讨论】:
我从来不知道int arr[a][b]
是一个选项作为参数;这是什么时候出现在标准中的?
@hacks。另一种也是将 2D 的引用作为 1D 指针传递(不推荐)。
我喜欢第二/第三个例子,因为使用它只需要知道二维数组的宽度。
@ABD;我附上了答案的链接。阅读接受的答案以获取详细说明。
前 3 个选项都具有相同的语义含义,我认为这将有助于一般读者在问题中涵盖这一点。 (前两个调整为int (*arr)[b]
)。但是,我会使用第一个作为其自我记录价值。还建议 C2X 弃用 *
版本【参考方案2】:
这不是一个真正的答案,而是对 OP 的评论问题的扩展评论,“你可以在不知道行数的情况下传递数组,但是你怎么知道何时停止打印行?”
回答:通常,您不能不传递数组大小。看看这个一维示例,它破坏了数组大小。
#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
【讨论】:
以上是关于传递可变大小的多维数组的主要内容,如果未能解决你的问题,请参考以下文章