2012-05-16 43 views
1

假設以下情形:char *爲char [] - 是否有必要?

while(!notTheEnd) { 
char str[1024]; 
char* ptr_to_str; 


/* some strcat, strcpy on str */ 

ptr_to_str = str; 

chmod(ptr_to_str, 0777); 
} 

我必須設置的char * ptr_to_str = NULL和自由,以避免內存泄漏?

只是我在想的一個理論問題。

+1

'while(!notTheEnd)' - 「while not not end」?看起來像一個錯誤。 – Jesper

+0

哈哈你是對的。只是一個快速虛構的場景;)沒有真正的代碼。 – Stefan

+0

ptr_to_str只是一個不會忘記的指針,你必須找出實際數據來自哪裏,在這種情況下,它來自你的本地(讀取:堆棧)變量'str'。由於它是在堆棧中分配的,因此不需要釋放/刪除它。 – fileoffset

回答

7

你只需要free()你有什麼malloc() ed。因此:

又見了free()手冊頁:

的free()函數釋放內存空間由PTR,必須已返回由以前調用的malloc()指出,釋放calloc ()或realloc()。否則,或者如果釋放(ptr)之前已被調用,則會發生未定義的行爲。如果ptr爲NULL,則不執行任何操作。

注意,其它功能可以使用malloc()或類似內部因此也要求返回的緩衝區(例如strdup)被free'd。不需要設置指針NULL的指針。然而,它增加了一些便利,因爲對該指針的後續調用free()不會將應用程序暴露給未定義的行爲。而且,如果一致地完成,您可以檢查指針是否確實指向一個對象。

+0

好的,謝謝。我想到了這樣的事情,但在某種程度上,我有點不確定O :-) – Stefan

4

您從未撥打malloc(),因此您無需致電free()

你有什麼是一個指向堆棧上的字符數組的指針,它不需要顯式的重新分配。

3

不,只要你不分配內存(在堆上),你不需要釋放它。有一些例外(如strdup),但這是一般規則。

1

​​將在當前堆棧中分配1024個字節。當函數返回時,這個空間將自動「彈出」。所以你不需要明確地釋放這個內存。