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]’
所有数组都会陷入指针,所以我确定无法传递指针。
非常感谢任何建议,
答案 0 :(得分:2)
“所有数组衰变为指针”是对C的常见误解。
此FAQ中的前几个答案澄清了这个问题。
答案 1 :(得分:1)
你可以施放:
get_elements((char **) elements);
char **
和char[128][128]
显然是不同的类型。
答案 2 :(得分:1)
您的原型看起来非常破碎,缺少类型名称。
并且您不能使用“衰减”指针,因为这会丢失有关数组维度的信息,这些信息(显然)需要正确计算访问权。
在我看来,最好的方法是将指针传递给第一个元素,并根据需要传递尺寸。对于2D,这将做:
int get_elements(int *elements, size_t width, size_t height);
这还要求您决定并遵守元素的内存布局,例如column-major或row-major。这会影响您计算给定元素的地址的方式。
答案 3 :(得分:1)
"二维数组和双指针不一样" "二维数组是一个指针数组"
读取数组和指针
时学习/记忆的是什么说元素 - 数据有内存启动位置100 .. 而元素指针在位置50处有内存。
元素数据从100到100 + MAX_NUM_ELEMENTS * MAX_STRING_LEN -1分配内存。 而且您需要从100 ..
访问数据但是您将元素作为双指针传递..因此它尝试访问(50-> 100->实际数据)位置而不是访问(50-> 100)'位置..
如果你将原型改为int get_elements(char * element [])..它会工作..
答案 4 :(得分:1)
如果传递给您的函数的对象定义为:
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])
(两种形式都是等同的)
原因是
类型的对象的值的类型 char [MAX_NUM_ELEMENTS][MAX_STRING_LEN]
是
char (*)[MAX_STRING_LEN]
(指向MAX_STRING_LEN
个字符数组的指针)而不是char **
(指向char
指针的指针)。