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



我是在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 %dn",*OPSTR,OPSTR);
    free(OPSTR);
    }
    

fprintf(..OPSTR)部分在declare_cal_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));
    }
    

和自由,

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

这再次给出了上面相同的错误,但如果我空闲,

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

程序运行时没有出错。

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

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

关于在C中分配内存,(不适用于C++)在C中使用[m][c]alloc时,一条一般规则是(尽管仍有严格的争论)不需要(或建议)强制执行返回。例如,以下内容:

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);

相关内容

  • 没有找到相关文章

最新更新