我有一个具有以下原型的函数:
int foo(int bar[][N]);
我想把变量
int ** baz
发送给它,它是一个同样大小的数组,只分配了它。我试图显式地强制转换和调用
foo()
就像这样:foo((int(*)[N])baz);
并且它消除了编译器中的错误,但是当进入baz
时,foo()
中的所有值都变成了垃圾(为什么会发生btw?).有没有一种方法可以在不复制同一个函数并改变它的原型的情况下做到这一点?
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
。考虑到您的注释,然后动态分配二维数组并返回指向该数组的指针的函数可以如下所示
#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;
}
我展示了声明函数的两种方法。
关于c - 使int foo(int bar [] [N])与int ** baz一起工作,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30131020/