2012-11-18 137 views
2

我有一個函數分配字符串並返回它的指針。當我在其他功能的調用中直接使用它時,是否需要釋放內存?C - 釋放內存分配功能

例如:

char *getRow(){ 
    char *someString = (char*) malloc(sizeof(char) * 10); 
    strcpy(someString , "asdqwezxc"); 
    return someString; 
} 

int main(){ 
    printf("%s", getRow()); 
} 

在該函數分配的內存會發生什麼?有什麼方法可以釋放它,或者在使用它之前是否需要將它存儲到某個變量中?

+3

這正式泄漏了分配的內存。在*這個*代碼中,這並不重要,因爲此後程序立即結束,但這不是一個好習慣。 – dmckee

+0

這是不好的做法,最好將指針作爲參考傳遞,這樣就可以像函數一樣在函數外部分配和釋放字符串。 –

+0

如果分配大小總是像本例中一樣是靜態的,那麼您始終可以使用您傳遞的固定大小的緩衝區作爲參數來獲取行。就像一個charbuf [10]; getRow(buf);'雖然有限的情況可以應用,但是您必須非常關注getRow的調用合約。 (換句話說,除非你有更多的限制,否則對於任何複雜的東西來說可能是個壞主意。) – Corbin

回答

6

即使您已從函數返回,也不會解除分配內存,除非您明確這樣做。因此,您必須存儲返回值並致電free

int main(){ 
    char* str = getRow(); 
    printf("%s", str); 
    free(str); 
} 
+0

好的謝謝,我只是希望有一些方法,因爲它非常舒適的調用函數,如printf(「%s」,getRow());而不是存儲它,然後使用,特別是當你需要用不同的參數 – user10099

+0

多次調用該函數時,但我將如何返回它?局部變量在函數結束後死亡,不是嗎? – user10099

+0

你說得對。那麼你不能退回。 –

1

您需要將它存儲在一個變量中,然後使用它,然後釋放它。如果你沒有釋放它,你會得到內存泄漏。

0

是的,你需要。 malloc從堆中分配內存,您需要明確釋放它。變量如char * someString從堆棧分配,當函數返回時將被釋放。我認爲你誤解堆棧和堆。

看看這個what-and-where-are-the-stack-and-heap