我是在C中使用malloc的新手。我试图声明一个动态的结构数组,然后释放它,类似于2D aray并释放它。我正在使用gcc来编译代码。
第一个问题是关于使用结构数组,
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);
}
fprintf(.. OPSTR)部分在declare_local_structure()和free_local_structure()中给出相同的地址,表示平均时间内没有指针发生错误。如果我注释掉免费(OPSTR)部分,该程序运行良好。否则,它运行,并在最后,调用free_local_structure(),它给出以下错误。 *`./a.out' ;: free()出错:无效大小:0x0000000002d2fd40 *
在另一部分的同一个程序中,我正在使用一个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);
程序运行没有错误。
错误在哪里?我试过&#34; valgrind&#34;,但无法理解输出。另一点是程序在使用C99编译时出错。
gcc -std=c99 *.c headers/*.h -lm
答案 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);