声明和释放2D动态数组和结构数组

时间:2017-10-06 20:31:52

标签: c pointers malloc free

我是在C中使用malloc的新手。我试图声明一个动态的结构数组,然后释放它,类似于2D aray并释放它。我正在使用gcc来编译代码。

  1. 第一个问题是关于使用结构数组,

    struct OPinfo {
    
            long NLocal;
    
            double ReFrame,ImFrame,lcl_ReFrame,lcl_ImFrame,lcl_SqFrame;
    
    };
    
    struct OPinfo *OPSTR;
    
    
    void declare_local_structure() {
            OPSTR = (struct OPinfo*) malloc(NBinsR * sizeof(struct OPinfo));
            int i =0;
            while(i<NBinsR) {
                    OPSTR[i].NLocal = 0;
                    OPSTR[i].ReFrame = 0.0;
                    OPSTR[i].ImFrame = 0.0;
                    OPSTR[i].lcl_ReFrame = 0.0;
                    OPSTR[i].lcl_ImFrame = 0.0;
                    OPSTR[i].lcl_SqFrame = 0.0;
                    i++;
            }
    
    }
    void free_local_structure() {
            fprintf(stderr,"%d %d\n",*OPSTR,OPSTR);
            free(OPSTR);
    }
    
  2. fprintf(.. OPSTR)部分在declare_local_structure()和free_local_structure()中给出相同的地址,表示平均时间内没有指针发生错误。如果我注释掉免费(OPSTR)部分,该程序运行良好。否则,它运行,并在最后,调用free_local_structure(),它给出以下错误。   *`./a.out' ;: free()出错:无效大小:0x0000000002d2fd40 *

    1. 在另一部分的同一个程序中,我正在使用一个2D数组指针,我在其中声明,

      double **Gxy, **GxyRot;
      Gxy = (double**) malloc((NBinsXY) * sizeof(double *));
      GxyRot = (double**) malloc((NBinsXY) * sizeof(double *));
      
      for(j=0; j<NBinsXY; j++) {
              Gxy[j] = malloc(NBinsXY *   sizeof(double));
              GxyRot[j] =  malloc(NBinsXY *   sizeof(double));
      }
      
    2. 并免费,

      for(l=0;l<NBinsXY;l++) {   
              free(Gxy[l]);
              free(GxyRot[l]);
      }
      
      free(Gxy);
      free(GxyRot);
      

      这再次给出了同样的错误,但如果我自由,

      free(*Gxy);
      free(*GxyRot);
      free(Gxy);
      free(GxyRot);
      

      程序运行没有错误。

      错误在哪里?我试过&#34; valgrind&#34;,但无法理解输出。另一点是程序在使用C99编译时出错。 gcc -std=c99 *.c headers/*.h -lm

1 个答案:

答案 0 :(得分:0)

我同意上述评论,关于积极使用调试器,因为它将提供有关问题性质和位置的详细信息。

关于在C中分配内存(不适用于C ++),在C中使用[m][c]alloc时的一般规则是(虽然仍然经过严格辩论) it not necessary (or recommended) 你投了回报。例如,以下内容:

Gxy = (double**) malloc((NBinsXY) * sizeof(double *)); 

应写成:

Gxy = malloc((NBinsXY) * sizeof(double *));
if(Gxy)//and always test for success before using pointers created using malloc/calloc
{
   ... 

关于免费,规则适用于[m][c]alloc()的每次通话,必须有相应数量的free(...)来电。因为您使用循环来分配内存,所以在免费期间使用循环也是有意义的:

for(j=0; j<NBinsXY; j++) {
    free(Gxy[j]);
    free(GxyRot[j]); 
}
free(Gxy);
free(GxyRot);