簡體   English   中英

聲明和釋放2D動態數組和結構數組

[英]Declaring and freeing 2D dynamic array and array of structures

我是在C中使用malloc的新手。我試圖聲明一個動態結構數組,然后釋放它,類似於2Dray並釋放它。 我正在使用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); } 

fprintf(.OPSTR)部分在clarify_local_structure()和free_local_structure()中給出了相同的地址,表明在此期間沒有指針事故。 如果我注釋掉free(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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM