如何将“指针指针”传递给期望“指向数组的指针”的函数

时间:2013-05-06 09:41:54

标签: c arrays pointers

考虑这段代码:

#define MAX 4
............
............ 
int** ptr = (int**)malloc(sizeof(int*)*MAX);
*ptr = (int*)malloc(sizeof(int)*MAX);
// Assigned values to the pointer successfully

如何使用foo()作为参数调用ptrfoo()的原型已声明如下:

void foo(int arr[][MAX]);

2 个答案:

答案 0 :(得分:6)

您无法将ptr作为参数传递给foo函数。

二维数组(数组数组)的内存布局与数组指针数组的内存布局完全不同。

更改函数签名以接受int**(可能还有大小信息),或将ptr定义为适当大小的二维数组。

答案 1 :(得分:3)

我将假设您的示例中的函数foo实际上需要一个int的二维数组,其中MAX列和未指定的行数。这适用于C和C ++,因为行在内存中的排列方式。行N + 1中的所有元素在行N中的所有元素之后连续出现。

语法int arr[][MAX]要求指向这种二维数组的第一个元素的指针,而不是指向行的指针数组。我假设你想要2-D数组,而不是指针数组。

首先,您需要正确分配元素。您尚未指定arr[][MAX]的最左侧维度或其来源。我假设它在变量dim中:

int (*ptr)[MAX];  /* pointer first element of an int[][MAX] array */

/* Allocate a 2-D array of dim * MAX ints */
ptr = (int (*)[MAX]) malloc( dim * MAX * sizeof(int) );

然后,要调用您的函数,只需执行foo( ptr ),它就可以正常运行而不会出现错误或警告。

为了使代码更清晰(特别是如果你使用了许多这些2-D数组),你可以考虑将指针类型包装在typedef中,并编写一个小函数来分配这些数组。 / p>

typedef int (*int_array_2d)[MAX];

int_array_2d alloc_int_array_2d( int dim1 )
{
    return (int_array_2d) malloc( dim1 * MAX * sizeof(int) );
}

这样,在代码的其他地方,你可以说更简单,更清洁的东西:

int_array_2d ptr = alloc_int_array_2d( dim );

使用类型系统对您有利。类型和类型转换的C和C ++语法很难看,大多数人都不熟悉。由于*[]的优先级,它们看起来很奇怪。如果你将它隐藏在typedef中,它可以帮助你专注于你正在尝试做的事情,而不是理解混合数组和指针时出现的C / C ++奇怪的优先级问题。