[英]passing a 2D array to a function
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]’
所有数组都会分解为指针,因此请确定为什么我不能只传递指针。
非常感谢您的任何建议,
“所有数组都退化为指针”是对C的普遍误解。
该常见问题解答中的前几个答案可以阐明问题。
您可以投射:
get_elements((char **) elements);
char **
和char[128][128]
显然是不同的类型。
您的原型看起来很破损,缺少类型名称。
而且您不能使用“衰减”指针,因为那样会丢失有关数组维数的信息,(显然)正确地计算访问量是必需的。
我认为最好的方法是将指针与第一个元素以及所需的尺寸一起传递给第一个元素。 对于2D,这可以做到:
int get_elements(int *elements, size_t width, size_t height);
这还要求您决定并坚持元素(例如,以列为主或以行为主)在内存中的布局。 这会影响您如何计算给定元素的地址。
“二维数组和双指针不相同”“二维数组是指针的数组”
是我在阅读数组和指针时学到/记住的
说元素-数据在位置100 ..处具有存储开始。元素指针在位置50 ..处具有存储。
元素数据的分配内存从100到100 + MAX_NUM_ELEMENTS * MAX_STRING_LEN -1 ..并且您需要从100访问数据。
但是您将元素作为双指针传递..因此,它尝试访问(50-> 100-> Actual data's Location)而不是访问(50-> 100)的location ..
如果将原型更改为int get_elements(char * element [])..它将起作用..
如果要传递给函数的对象定义为:
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])
(两种形式都等效)
原因是类型为object的值的类型
char [MAX_NUM_ELEMENTS][MAX_STRING_LEN]
是
char (*)[MAX_STRING_LEN]
一个指针数组MAX_STRING_LEN
字符),而不是char **
(指针的指针char
)。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.