我具有以下原型的功能:
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));
分配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;
}
i显示了函数声明的两种方式。
类型int **
与类型int (*)[N]
不兼容(这是您的函数参数的类型解决方案)。前者是指向int
指针的指针。后者是指向N
int
S。
在这一点上了解数组是不是指针非常重要。数组是同一类型的某些元素的连续块。在大多数上下文中,包括当它们以函数参数形式出现时,具有数组类型的表达式的值会自动转换为指示器(到数组的第一个元素),但这与数组对象是指针。这种区别是常见的混乱来源,但是必须了解何时是骨料类型的成员,例如结构,联合或高维数组。
如果要动态分配可以传递到功能的M X N数组,则看起来像这样:
int (*baz)[N] = malloc(M * sizeof(*baz));
如果要将现有指针指针传递给功能,则该功能应具有此原型:
int foo(int **bar);