2012-12-23 51 views
4

我試圖釋放一個struct size_t變量和char的元素。如何釋放的size_t的,因爲我不斷收到警告信息,如如何從結構中釋放size_t

[Warning] passing arg 1 of `free' makes pointer from integer without a cast 

現在我明白了,我需要做一個演員,但我不知道怎麼辦!這裏的代碼:

typedef struct collection 
{ 
    char **c; 
    size_t nc, na, ne; 
} TCS, * ACS; 

void Destroy(ACS *x) 
{ 
    int i; 
    free((*x)->na); 
    for(i=0;i<(*x)->nc;i++) 
     free((*x)->c[i]); 
    free((*x)->c); 
    free((*x)->nc); 
    free((*x)->ne); 

} 

/* allocating */ 
ACS AlocCS(size_t d, size_t e) 
{ 
    ACS *af=(ACS*)malloc(d); 
    if(af==NULL) 
     return 0; 
    (*af)->na=e; 
    (*af)->nc=d; 
    (*af)->c=(char**)calloc(e*d,sizeof(char)); 
    if((*af)->c==NULL){ 
     free(af); 
     return 0;}    

    return *af; 
} 

我收到3警告,所有與na,ne,nc有關。我在跳什麼?謝謝! LE:謝謝大家,我的項目現在正常運作!節日快樂!

回答

4

我收到3條警告,全部與na,ne,nc有關。我在跳什麼?

malloc返回指向動態分配的內存區域的指針。 size_t變量不能保存這樣的地址。

你只需要釋放你的分配,即(*af)->caf

3

如果您還沒有動態分配的變量:

size_t nc, na, ne; 

沒有理由釋放他們。

您不會在靜態分配的變量上調用free,只能在存儲在指針中的地址上指向以前分配的區域。

當你這樣做:

(*af)->na=e; 
(*af)->nc=d; 

您還沒有分配變量nanc;您只需將值分配給屬於先前分配的結構的這些變量,並由存儲在af中的地址指定。

+0

那麼,他有某種意義。他分配了整個'struct collection'對象,其中包含這些對象。但釋放所述對象會自動釋放它們,所以是的,單獨釋放它們是沒有意義的。 – delnan

+0

我有,但沒有發佈功能。現在編輯。 – SpaceNecron

+0

@ user1889921請將該信息添加到您的問題,請勿發表評論。 – Rubens

3

你因爲這三個領域並沒有建立這樣,你不應該試圖free他們應該只在被呼叫分配給malloc對象,realloccalloc等來電free

這三個字段的內存是分配結構時分配的結構的一部分。它沒有單獨分配。因此不需要單獨的重新分配。

2

size_t是局部變量,意味着它們不是動態分配的(即它們是爲結構分配的內存的一部分,並且不需要手動管理它們的內存)。一旦你釋放結構,局部變量將自動清理。

+0

並非如此。在這種情況下,他們生活在一堆。 –

+0

是的,你說得對。我澄清了我實際上的意思。 –

+0

分開分配將比動態分配更清晰。 –