您传递了一个数组指针,但是您的函数期望一个指向指针的指针。在C语言中,数组名会衰减(decay)为一个值,即第一个数组元素的指针。在这种情况下,第一个数组元素是一个数组,因此函数参数会衰减为一个指向数组的指针。
以下是一个解决方法。将函数修改为使用
void *
类型接收参数,以免维度干扰参数。然后,在函数体中使用维度参数来创建2D数组的正确指针类型。
void print2(void *p,int n,int m)
{
int i,j;
int (*array)[m] = p;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%d ",array[i][j]);
printf("\n");
}
}
如果您愿意更改参数的顺序,那么可以使用数组参数的正确类型:
void print2(int n, int m, int array[n][m])
{
int i,j;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%d ",array[i][j]);
printf("\n");
}
}
由于Jack问及C89,这里有一种处理方法。既然一个二维数组在内存中的组织方式与一个长的一维数组相同,因此您可以直接按照这样的方式遍历传入的指针。同样,我们将输入参数作为void *
来接受,以避免处理衰减类型。然后,我们将指针视为长的一维数组,但根据适当的维度进行遍历:
void print2(void *p, int n, int m)
{
int i,j;
int *array = p;
for(i=0;i<n;i++)
{
for(j=0;j<m;j++)
printf("%d ",array[i*m+j]);
printf("\n");
}
}
警告:传递给print2的第一个参数类型不兼容
我不理解之前问题中给出的解决方案 :s - Jaime Oro