将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。 这会影响您计算给定元素的地址的方式。