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

Making int foo(int bar[][N]) work with int ** baz

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

int foo(int bar[][N]);

我想将变量 int ** baz 发送给它,它是一个相同大小的数组,只是它被分配了。

我试图像这样显式地转换和调用 foo()foo((int(*)[N])baz); 它消除了编译器的错误但是 baz 中的所有值在 [=13] 中都变成了垃圾=](顺便说一句,为什么会这样?)。

有没有一种方法可以在不复制相同函数并更改其原型的情况下做到这一点?

baz 是这样分配的:

int ** baz = (int**)malloc(N*sizeof(int*));
    for (i = 0; i < N; i++)
        baz[i] = (int*)malloc(N*sizeof(int));

像这样分配 baz

int ( *baz )[N] = malloc( N * N * sizeof( int ) );

这种情况调用函数是没有问题的

int foo(int bar[][N]);

带有参数 baz

考虑到您的评论,动态分配二维数组的函数和 returns 指向它的指针可能看起来像

#include <stdio.h>
#include <stdlib.h>

#define N   10

typedef int ( *PTR )[N];

PTR allocate( int n );

int ( *allocate( int n ) )[N]
{
    int ( *p )[N] = malloc( n * sizeof( *p ) );

    return p;
}

int main( int argc, char * argv[] )
{
    free( allocate( N ) );

    return 0;
}

我展示了函数声明的两种方式。

类型 int ** 与类型 int (*)[N] 不兼容(您的函数参数的类型解析为)。前者是指向int的指针。后者是指向 N int 数组的指针。

此时理解数组是不是指针是非常重要的。数组是一定数量的相同类型的元素的连续块。在大多数情况下,包括当它们作为函数参数出现时,具有数组类型的表达式的值会自动 转换 为指针(指向数组的第一个元素),但这与数组完全不同对象 指针。这种区别经常引起混淆,但必须了解数组何时是聚合类型的成员,例如结构、联合或高维数组。

如果您想动态分配一个可以传递给函数的 M x N 数组,则如下所示:

int (*baz)[N] = malloc(M * sizeof(*baz));

如果你想将你现有的指针传递给你的函数,那么函数应该有这个原型:

int foo(int **bar);