2011-05-12 130 views
3

因爲我已經完成了一些C操作,所以需要一段時間,我必須重新理解指針。這是一個修改指針內容的函數。問題是這個代碼是否正確。如果我只釋放指針或是否必須釋放指針的內容,那麼這就足夠了嗎?正確的釋放內存的方法

void foo(char **str) { 
    // str has been allocated enough bytes for the following text 
    *str = "allocate some text"; 
} 

int main(int arc, char *argv[]) { 
    char *someString; 
    foo(&someString); 
    free(someString); // is this the correct place to free 
} 

謝謝。

+0

我相信你函數調用應該是'foo(&someString);'... – 2011-05-12 13:03:59

+0

這將是foo(&someString)。 – Mel 2011-05-12 13:04:14

+0

你是對的。 Editted。 – ALOToverflow 2011-05-12 13:05:26

回答

10

不,您不想撥打free(),因爲您從來沒有malloc() -ed數據。更具體地說,在指向字符串文字的指針上調用free()導致未定義的行爲

2

你不應該在這種情況下免費。 free()應始終對應於對malloc()函數的調用。

在這裏你是'釋放'永遠不會分配在首位的恆定內存。

-2

首先應該調整foo方法的調用,因爲參數不匹配。它應該是這個樣子

foo(&someString); 

但我個人會同意,你調用的方法free(someString)的地方。因爲應用程序即將結束,您不再需要任何指針。

+1

-1:不,不應該調用'free()'。 – 2011-05-12 13:11:30

1

在這段代碼中有些東西讓我感到困惑。

爲什麼評論說「str已被分配足夠的字節爲以下文本 」?即使已經分配了,您也正在爲指針分配一個新值,所以它不會向您購買分配了該內存的任何東西。

無論如何,根據此代碼,不應該調用free()

1

你沒有在你的代碼中顯示,但是你寫了str已經被分配了足夠的字節。所以這是罰款,並可以free版,但比你的指針分配給常量字符串爲str - *str = "allocate some text";(和OLI說,導致自由未定義行爲),而不是執行strcpy()

strcpy(str, "allocate some text");