我正在编写一个程序来读取和存储3D数组,然后打印所有2D部分,我收到此警告(对于free(* mat1)[i] [j]):
|warning: passing argument 1 of 'free' makes pointer from integer without a cast|
当我在计算机上运行该程序时,该程序运行正常,但是当我在系统中提交该程序时,出现如下错误:
错误类型:SIG
Message: Program was stopped by signal 11 [0.000000 sec]. Either Memory limit of 4000 Kb exceeded or invalid memory operation.
这是我完整的代码:
#include <stdio.h>
#include <stdlib.h>
int main()
{
int m,n,p,i,j,k;
int *** mat1;
scanf("%d",&m);
scanf("%d",&n);
scanf("%d",&p);
mat1 =(int ***) malloc(m * sizeof(int **));
if (mat1 == NULL)
{
printf("Error 1");
exit(1);
}
for(i = 0; i < m; i++)
{
mat1[i] =(int **) malloc(n * sizeof(int *));
if (mat1[i] == NULL)
{
printf("Error 2");
exit(1);
}
for (j=0 ; j<n ; j++)
{
mat1[i][j] = (int * )malloc(p * sizeof(int ));
if (mat1[i][j] == NULL)
{
printf("Error 3");
exit(1);
}
}
}
for(i=0;i<m;i++) // reading matrix A input
{
for(j=0;j<n;j++)
{
for (k = 0 ; k < p ; k++)
scanf("%d",&mat1[i][j][k]);
}
}
for(i=0;i<p;i++) //output matrix A
{
printf("Section %d: \n", i+1);
for(j=0;j<n;j++)
{
for (k = 0 ; k <m ; k++)
{
printf("%d ",mat1[k][j][i]);
}
printf("\n");
}
}
for (i = 0; i < m; i++)
{
for (j = 0; j< n; j++)
free((*mat1)[i][j]); //this row is where the warning is coming from
free((*mat1)[i]);
}
free(*mat1);
return 0;
}
最佳答案
该行有效:
mat1[i][j] = (int * )malloc(p * sizeof(int ));
因为
mat1
是int***
,所以mat1[i][j]
是int*
。但这不是:
free((*mat1)[i][j]);
因为
*mat1
是int**
,所以(*mat1)[i][j]
是int
,这正是警告中所抱怨的。我相信您想要的是:
free(mat1[i][j]);
对应于上面引用的
malloc
。