在这个函数定义中,我已经为2D数组的地址取了参数.
void dynamic(int ***a,int r,int c)
{
*a = (int**)malloc(sizeof(int*)*r);
for(int i=0;i<r;i++)
{
(*a)[i] = (int*)malloc(sizeof(int)*c);
}
}
我传递的参数如下所示,
dynamic(&a,r1,c1);
如果我直接把二维数组作为参数,那么它就不接受输入。
但是,在这段代码中,在add函数中,我没有取二维数组的地址,而是取二维数组本身,但是所做的更改将被保留。
void add(int **a,int **b,int r,int c,int **sum)
{
static int i=0,j=0;
if(i>=r)
{
return;// sum;
}
else
{
if(j<c)
{
sum[i][j] = a[i][j]+b[i][j];
j++;
add(a,b,r,c,sum);
}
j=0;
i++;
add(a,b,r,c,sum);
}
}
但是如果引用add函数,我得到的是垃圾值.
void add(int **a,int **b,int r,int c,int ***sum)
{
static int i=0,j=0;
if(i>=r)
{
return;
}
else
{
if(j<c)
{
(*sum)[i][j] = a[i][j]+b[i][j];
j++;
add(a,b,r,c,sum);
}
j=0;
i++;
add(a,b,r,c,sum);
}
}
我试着写一个函数来动态分配一个二维数组,但是没有输入值,我把二维数组的地址传递给动态函数,这次成功了.我对add函数应用了同样的逻辑,但是没有得到正确的结果,当我直接传递二维数组时,它成功了,可能是什么原因.
2条答案
按热度按时间gojuced71#
此时:
编译器不知道数组的维数,因为函数:
不提供此类信息,换句话说,指针的指针和二维数组不是同一类型,您不能期望编译器从
int **
推导出int(*)[dim]
或int [][dim]
从C99开始,您可以使用VLA(variable-length arrays)来解决此问题:
请注意,在C11中,VLA是可选的
p8ekf7hl2#
调用这两个递归函数的结果没有区别。
然而,这些函数有一个严重的缺点:如果被调用超过一次,则它们将不起作用,因为静态变量
i
的值在函数调用之后没有被重置为0
。同样,将参数
sum
声明为因为这个函数并不改变作为参数的指针本身,而是改变指针所指向的数据。
使用你的方法,递归函数可以按照下面的演示程序定义。函数被调用两次,以确保在第一次调用函数后,其静态变量被正确重置,并且可以第二次调用函数。
在程序中没有使用动态分配的数组来简化代码。
程序输出为
可以看出,每次调用该函数时,它都能正确工作。
函数的参数
r
和c
具有无符号整数类型unsigned int
而不是int
,因为将它们声明为具有有符号整数类型是没有意义的,尽管通常使用类型size_t
而不是类型unsigned int
会更好。