将2D数组传递给函数

gcc 4.6.2 c89

我有以下要传递给函数的2D数组:

char elements[MAX_NUM_ELEMENTS][MAX_STRING_LEN] = {{0}}; 

我的函数原型是:

 int get_elements(char **elements) 

我正在调用这样的函数:

 get_elements(elements); 

但是,我收到以下错误:

 expected 'char **' but argument is of type 'char (*)[128]' 

所有数组都会转换为指针,所以我确定为什么我不能只传递指针。

非常感谢任何建议,

如果要传递给函数的对象定义为:

 char elements[MAX_NUM_ELEMENTS][MAX_STRING_LEN]; 

你的函数原型不应该是:

 int get_elements(char **elements) 

反而:

 int get_elements(char elements[][MAX_STRING_LEN]) 

要么

 int get_elements(char (*elements)[MAX_STRING_LEN]) 

(两种forms都相同)

原因是类型对象的值的类型

char [MAX_NUM_ELEMENTS][MAX_STRING_LEN]

char (*)[MAX_STRING_LEN] (指向MAX_STRING_LEN字符数组的指针)而不是char ** (指向char **指针的指针)。

“所有数组衰变为指针”是关于C的常见误解。

本FAQ中的前几个答案澄清了这个问题。

你可以施放:

 get_elements((char **) elements); 

char **char[128][128]显然是不同的类型。

“二维数组和双指针不一样”“二维数组是一个指针数组”

是我在阅读有关数组和指针时学习/记忆的内容

说元素 – 数据有内存startin位置100 ..元素指针在位置50有内存

元素数据从100到100 + MAX_NUM_ELEMENTS * MAX_STRING_LEN -1分配内存。您需要访问100中的数据..

但是您将元素作为双指针传递..因此它尝试访问(50-> 100->实际数据)位置而不是访问(50-> 100)的位置..

如果你将原型更改为int get_elements(char * element [])..它将工作..

你的原型看起来非常破碎,缺少类型名称。

并且您不能使用“衰减”指针,因为这会丢失有关数组维度的信息,这些信息(显然)需要正确计算访问权限。

在我看来,最好的方法是将指针传递给第一个元素,并根据需要传递尺寸。 对于2D,这将做:

 int get_elements(int *elements, size_t width, size_t height); 

这还要求您决定并遵守元素的内存布局,例如column-major或row-major。 这会影响您计算给定元素的地址的方式。