使int foo(int bar [] [N])与int ** baz一起使用

时间:2015-05-08 19:00:30

标签: c syntax casting

我有一个带有以下原型的函数:

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));

2 个答案:

答案 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);