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

C 使int-foo(int-bar[][N])与int**baz一起工作,c,syntax,casting,C,Syntax,Casting,我有一个具有以下原型的函数: int foo(int bar[][N]); int foo(int **bar); 我想向它发送变量int**baz,它是一个大小相同的数组,只是分配了它 我试图显式地强制转换并调用foo(),就像这样:foo((int(*)[N])baz)并使编译器的错误静音,但是baz中的所有值在foo()中都变成垃圾(顺便说一句,为什么会发生这种情况?) 有没有一种方法可以做到这一点,而不必重复相同的功能和改变它的原型 baz是这样分配的: int ** baz = (

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

int foo(int bar[][N]);
int foo(int **bar);
我想向它发送变量
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));
int**baz=(int**)malloc(N*sizeof(int*);
对于(i=0;i
像这样分配baz

int ( *baz )[N] = malloc( N * N * sizeof( int ) );
在这种情况下,调用函数没有问题

int foo(int bar[][N]);
带有参数
baz

考虑到您的注释,动态分配二维数组并返回指向该数组的指针的函数可以如下所示

#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;
}
#包括
#包括
#定义n10
typedef int(*PTR)[N];
PTR分配(intn);
整数(*分配(整数n))[n]
{
int(*p)[N]=malloc(N*sizeof(*p));
返回p;
}
int main(int argc,char*argv[])
{
自由(分配(N));
返回0;
}
我展示了函数声明的两种方式。

类似于

int ( *baz )[N] = malloc( N * N * sizeof( int ) );
在这种情况下,调用函数没有问题

int foo(int bar[][N]);
带有参数
baz

考虑到您的注释,动态分配二维数组并返回指向该数组的指针的函数可以如下所示

#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;
}
#包括
#包括
#定义n10
typedef int(*PTR)[N];
PTR分配(intn);
整数(*分配(整数n))[n]
{
int(*p)[N]=malloc(N*sizeof(*p));
返回p;
}
int main(int argc,char*argv[])
{
自由(分配(N));
返回0;
}

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

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

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

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

int (*baz)[N] = malloc(M * sizeof(*baz));
如果要将现有指针传递给函数,则函数应具有以下原型:

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

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

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

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

int (*baz)[N] = malloc(M * sizeof(*baz));
如果要将现有指针传递给函数,则函数应具有以下原型:

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

baz
是如何分配的?@Lashane补充道。这是你的问题,你需要做
int**baz=(int**)malloc(N*N*sizeof(int))而不是malloc,然后在loop@Lashane为什么
N*N
?这是一个2d数组。对,它是2d数组,2d数组包含N*N个元素,但您正在分配1d数组大小为N的数组,并带有指向另一个数组的指针。如何分配
baz
?@Lashane补充道。这是您的问题,您需要执行
int**baz=(int**)malloc(N*N*sizeof(int))而不是malloc,然后在loop@Lashane为什么
N*N
?这是一个2d数组。对,它是2d数组,2d数组包含N*N个元素,但您正在分配1d数组大小为N的数组,并带有指向另一个数组的指针。这种类型
int(*)[N]
?我的意思是,如果我想从函数返回
baz
,我应该返回什么类型?@kuhaku有两种方法。您将声明一个typedef,例如typedef int(*PTR)[N];(可以使用任何标识符而不是PTR)并使用此typedef名称作为返回类型。或者可以显式地编写原始返回类型,例如int(*f())[N];哦,用typedef真不错。这是我第一次看到这样包装函数的原型。谢谢您的解释。这种类型是
int(*)[N]
?我的意思是,如果我想从函数返回
baz
,我应该返回什么类型?@kuhaku有两种方法。您将声明一个typedef,例如typedef int(*PTR)[N];(可以使用任何标识符而不是PTR)并使用此typedef名称作为返回类型。或者可以显式地编写原始返回类型,例如int(*f())[N];哦,非常整洁