我有一个带有以下原型的函数:
int foo(int bar[][N]);
我想向它发送变量int ** baz
,它是一个大小相同的数组,只是它被分配了。
我尝试显式转换并调用foo()
,如此:foo((int(*)[N])baz);
并且它使编译器中的错误无效,但baz
中的所有值在foo()
时变为垃圾(为什么会发生这种情况?)。
有没有办法在不重复相同功能和更改原型的情况下执行此操作?
baz
的分配方式如下:
int ** baz = (int**)malloc(N*sizeof(int*));
for (i = 0; i < N; i++)
baz[i] = (int*)malloc(N*sizeof(int));
答案 0 :(得分:3)
分配baz,如
template<class Callable>
void call(Foo* foo, Callable&& callback) {
callback(foo);
}
int main()
{
call(foo, [] (Foo* f) { f->print(); f->print(1); });
}
在这种情况下,调用函数
没有问题int ( *baz )[N] = malloc( N * N * sizeof( int ) );
带参数int foo(int bar[][N]);
。
考虑到你的评论,然后动态分配二维数组并返回指向它的指针的函数可能看起来像
baz
我展示了两种声明函数的方法。
答案 1 :(得分:2)
类型int **
与类型int (*)[N]
不兼容(这是函数参数解析的类型)。前者是指向int
指针的指针。后者是指向N
int
s。
在这一点上理解数组是不是指针是非常重要的。数组是一些相同类型元素的连续块。在大多数情况下,包括它们作为函数参数出现时,具有数组类型的表达式的值会自动转换到指针(到数组的第一个元素),但这与数组对象成为指针。这种区别经常引起混淆,但必须了解数组何时是聚合类型的成员,例如结构,联合或更高维数组。
如果你想动态分配一个可以传递给你的函数的M x N数组,那么它看起来像这样:
int (*baz)[N] = malloc(M * sizeof(*baz));
如果要将现有指针指针传递给函数,那么该函数应具有以下原型:
int foo(int **bar);