[英]Declaring and freeing 2D dynamic array and array of structures
我是在C中使用malloc的新手。我試圖聲明一個動態結構數組,然后釋放它,類似於2Dray並釋放它。 我正在使用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)部分在clarify_local_structure()和free_local_structure()中給出了相同的地址,表明在此期間沒有指針事故。 如果我注釋掉free(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);
程序運行無錯誤。
錯誤在哪里? 我嘗試了“ 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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.