将2D数组传递给函数

时间:2012-01-04 10:23:46

标签: c pointers

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]’

所有数组都会陷入指针,所以我确定无法传递指针。

非常感谢任何建议,

5 个答案:

答案 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指针的指针)。