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];哦,非常整洁