2011-09-23 49 views
3

我已經把一些代碼分成了兩個文件,它之前工作。在一個文件中,我有一個函數,它有一個out值參數,它是一個指向指針的指針。爲什麼我無法獲取返回值的地址?

我用填充調用此參數的getter和取消引用它:

foo(&bar()); 

但是我得到一個錯誤說「」 &「需要一個左值」。我明白這個錯誤意味着什麼,但是我認爲我能夠做到這一點,因爲它是一個指針,所以它代表了原來的'事情'。

有什麼事情做的事實,實際指向的內存位置可能會改變,即使它會指向正確的事?但爲什麼它在同一個文件中,而不是現在之前工作?

在此先感謝!

回答

5

那麼,你需要一個左值,即一些可以分配給。您不能分配給函數的返回值。

你需要做這樣的事情:

temp = bar(); 
foo(&temp); 
+1

當然,如果'foo'返回'美孚*'那麼你可以:-) – spraff

+0

@spraff嗯,引用。事情告訴我這可能是C代碼。 –

+0

「*** ***如果'foo'回來......」 – spraff

0

我猜bar()是:

type *bar() { return member_pointer; } 

它通過值返回指針member_pointer,因此不是L-vlaue。

如果你想修改foo()member_pointer,您需要:

type **bar() { return &member_pointer; } 
+0

所以你必須創建指針指針的getters?我以爲你可以使用getter來獲取指針,然後用&引用它。爲什麼你不能這樣做?要創造這麼多的獲得者似乎不夠高雅。 – SirYakalot

+0

@SirYakalot:只有當你想改變擁有的類中的指針值。 – Skizz

2

使用&,你是不是取消引用,但引用。要刪除,請使用*代替:foo(*(bar()));

如果你想參考它,就把bar()結果在一個臨時變量:

x = bar(); 
foo(&x); 
1

假設foo需要一個指針到整型,嘗試:

foo((int[]){bar()}); 
+0

+1非常好。似乎與一個結構一起工作。這是一個gcc擴展? (目前無法測試。) –

+0

這是C99(複合文字)。 –

相關問題