2012-07-18 127 views
1

在爲個人項目編程時,我發現當我傳遞指向一個函數的指針時,其值無法更改。例如:看調試器後malloc返回的指針是否可以更改

... 
GString *buf = NULL; 
buf = g_string_sized_new(64); 
somefunc(buf, filename); 
... 

void somefunc(GString *buf, gchar *filename) 
{ 
    buf = otherfunc(filename); //otherfunc() returns a GString * 
} 

我觀察到,當用於緩衝存儲器運行分配,則BUF = 0x80b720和otherfunc()返回0x80b750。儘管緩衝區的值沒有改變。所以我想問一下,如果有人知道爲什麼會發生這種情況,並且這是malloc()的一般特性。換句話說,如果將malloc()調用返回的指針傳遞給函數,那麼您能夠在函數體內部或外部更改此值嗎?

回答

8

這與malloc無關。

當您將指針傳遞給某個函數時,該函數將接收到原始指針的副本。它可以修改它自己的指針副本,但不能修改原始指針。

如果您希望它修改原始指針,您需要將原始指針的地址傳遞給原始指針,它將作爲指針接收指針。

void somefunc(GString **buf, gchar *filename) { 
    *buf = otherfunc(filename); 
} 
+1

可能要提及的,術語「由值傳遞」,和C是[按值傳遞](http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_value),而不是[通過傳參考](http://en.wikipedia.org/wiki/Evaluation_strategy#Call_by_reference)。 – sfstewman 2012-07-18 00:52:48

+2

我也想指出,改變函數內的buf值可能導致內存泄漏(因爲現在你不能釋放最初分配的內存) – 2012-07-18 00:54:45

+4

我想補充一點,傳遞一個指向函數的指針很漂亮就像傳遞一個整數到一個函數一樣,只是整數碰巧是一個內存地址。 – 2012-07-18 00:55:00