我正在编写一个程序来读取和存储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 ));


因为mat1int***,所以mat1[i][j]int*

但这不是:

free((*mat1)[i][j]);


因为*mat1int**,所以(*mat1)[i][j]int,这正是警告中所抱怨的。

我相信您想要的是:

free(mat1[i][j]);


对应于上面引用的malloc

10-08 12:53