prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 6.19

Q如何编写接受二维数组的函数,但其宽度在编译时未知?


A这并不总是容易的。一种方法是传递一个指向[0][0]元素的指针,以及两个维度,并“手动”模拟数组下标。

	void f2(int *aryp, int nrows, int ncolumns)
	{ ... array[i][j] is accessed as aryp[i * ncolumns + j] ... }
请注意,手动下标的正确表达式涉及ncolumns(每行的“宽度”),而不是nrows(行数);这很容易弄反。

此函数可以与问题 6.18 中的array一起调用,如下所示:

	f2(&array[0][0], NROWS, NCOLUMNS);

但是必须指出的是,以这种方式“手动”执行多维数组下标的程序并不严格符合 ANSI C 标准;根据官方解释,访问(&array[0][0])[x]对于x >= NCOLUMNS.

行为未定义。C99 允许可变长度数组(VLA),一旦接受 C99 扩展的编译器变得普及,VLA 可能会成为首选解决方案。(gcc早已支持可变大小数组。)

当你想让一个函数能够处理各种大小的多维数组时,一种解决方案是动态模拟所有数组,如问题 6.16 所示。

另请参阅问题 6.186.206.15

参考文献:ISO Sec. 6.3.6
C9X Sec. 6.5.5.2


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管