我是使用C中的malloc的新手。我试图声明一个动态数组结构,然后释放它,类似于2D aray并释放它。我使用gcc来编译代码。声明和释放2D动态数组和结构数组
第一个问题是使用结构阵列的关于,
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':无():无效尺寸: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);
这再次给SA我上面的错误,但如果我免费,
free(*Gxy);
free(*GxyRot);
free(Gxy);
free(GxyRot);
该程序运行没有错误。
错误在哪里?我尝试了“valgrind”,但无法理解输出。另一点是程序在编译C99时出错。 gcc -std=c99 *.c headers/*.h -lm
什么是你的调用'declare_local_structure'和'free_local_structure'之间*做*?也许你在代码中写出了没有向我们展示的内容?至于Valgrind,使用调试信息(在构建时添加'-g'标志)并重新运行,Valgrind将能够显示它找到的问题的源文件和行号信息。如果你无法弄清楚,那么编辑你的问题以包含Valgrind的完整复制粘贴(作为文本)输出。 –
将'-Wall -Wextra'添加到GCC命令行时会得到什么警告?至少应该有一个,因为你的'fprintf'调用是无效的(你不能将'* OPSTR'传递给'fprintf',并期望它正确地处理事情,特别是当你告诉它你传递一个数字时)我怀疑是什么导致了这个问题。 –
感谢您的“-g”建议。二维数组声明中的Valarind错误。 “initialize_declare.c:32”是数组Gxy和GxyRot,大小为8的无效读取 == 2138 ==在0x401864:calculate_bin(calculation.c:125) == 2138 == by 0x401E36:calculate_for_frame(calculation.c: 168) == 2138 == by 0x40359E:main(main_function.c:72) == 2138 ==地址0x652c710在一个大小为8,000的块后分配16个字节 == 2138 ==在0x4C2DB9D:malloc( vg_replace_malloc.c:299) == 2138 == by 0x402CCA:declare_arrays(initialize_declare.c:32) == 2138 == by 0x403516:main(main_function.c:58) – haphaZard