2016-05-16 70 views
6

我對C結構和數據類型有個問題。我有一個結構稱爲test什麼時候C結構可用內存結構

struct test 
{ 
    char* c; 
    char* c2; 
}; 

而且我從函數返回這個結構:

struct test a() 
{ 
    struct test t = { "yeah!", "string" }; 
    return t; 
} 

我的問題是,是否對結構的內存會自動釋放,或者如果我必須這樣做通過free()手動。

[更新from comment:]

的功能是在一個DLL,我想用結構中的主要程序。

+0

理解指針的好地方:http://cslibrary.stanford.edu/104/ – Chintan

+3

_Automatically_。完成。 –

+0

你怎麼理解「釋放」? –

回答

3

TL/DR版本:您不需要手動free任何東西;你可以像對待任何標量變量那樣對待這個結構實例。

稍長版本:的結構實例t具有自動存儲持續時間,這意味着它的壽命延伸過a功能的壽命;一旦a退出,將釋放爲t分配的任何內存。將拷貝的內容t返回給調用者。

至於那些內容...

cc2都指向字符串文字;字符串文字被分配,使得它們的生命週期延伸到整個程序的執行。因此cc2中的指針值將從a返回t後有效;的確,這些指針值在程序的整個生命週期內都是有效的。

您只需撥打free就可以通過malloc,callocrealloc分配的東西。

5

您應該只有free您首先編輯(或使用其他類似功能)的東西。由於沒有什麼是malloc ed,所以沒有什麼應該是free d。

+1

但我可以多久使用該結構呢?函數'a'在DLL中,我想在主程序中使用該結構。編譯器如何知道何時刪除結構? –

+0

編譯器使用memcopy拷貝結構體,當你返回t時 不幸的是,DLL在使用字符串文字(「yeah!」,「string」)返回數據方面做得很糟糕。它們的生命週期通常與DLL在大多數系統的內存中一樣長,因此返回的內存幾乎不可用。更好的解決方案是在堆上分配,然後執行字符串複製並返回結構。呼叫者一旦完成了結構,就可以免費使用它。 – Chintan

+0

@Chintan沒有這樣的保證。結構返回值也可能在寄存器等中。 –

0

您不必釋放非動態分配。儘管如此,如果你想在其他函數中使用這個結構體,你必須傳遞這個結構體的地址,並把它作爲(struct *),否則你將無法再使用它。

+1

不正確。結構可以(在這種情況下)通過值傳遞很好。 –

+0

我從不否認。所以請停止downvote請沒有。 –

+1

你的回答顯然與該陳述相矛盾。 –