1

考虑这段代码:

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

如何foo()使用ptras 参数调用?foo()的原型声明如下:

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

2 回答 2

6

您不能ptr作为参数传递给该foo函数。

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

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

于 2013-05-06T09:46:45.783 回答
3

我将假设foo您示例中的函数实际上需要一个 2-D 数组int,其中包含MAX列和未指定的行数。由于行在内存中的布局方式,这在 C 和 C++ 中有效。第 N+1 行中的所有元素连续出现在第 N 行中的所有元素之后。

该语法int arr[][MAX]要求指向此类二维数组的第一个元素的指针,而不是指向行的指针数组。我假设您想要二维数组,而不是指针数组。

首先,您需要正确分配元素。您还没有指定最左边的维度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 ),它就会正常工作而不会出现错误或警告。

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

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++ 语法很难看,而且大多数人不熟悉。由于*vs.的优先级,它们看起来很奇怪[]。如果你把它隐藏起来typedef,它可以帮助你专注于你正在尝试做的事情,而不是理解混合数组和指针时出现的 C/C++ 奇怪的优先级问题。

于 2013-05-06T10:04:25.800 回答