2016-04-07 58 views
1

閱讀以下question之後,我明白沒有這種東西存在(至少不是'便攜式')。如何編寫一個返回指向堆棧的指針的函數

但是我在下面piece of code從單一的代碼庫,它會返回一個指向堆棧主演:

static void * 
return_stack_ptr() 
{ 
    gpointer i; 
    return &i; 
} 

我很驚訝的是,上面的代碼甚至可以在足弓工作(如PowerPC),我會假定這隻會在x86(也可能只有gcc)上工作。

這是要在PowerPC上工作嗎?

+1

沒有可以返回指向堆棧的指針的便攜式函數。只有一些不可移植性。 –

+0

這種東西是依賴於平臺和編譯器的。 –

+0

PowerPC ABI確實具有堆棧內存的概念,但是您的編譯器可能會選擇將變量'i'放入堆棧之外的另一個內存中。不過,我會說它可以用於任何主流的PowerPC編譯器 – atturri

回答

4

堆棧的目的是支持函數調用和局部變量。如果你的系統有一個堆棧,它將使用它,並在那裏分配局部變量。所以假設局部變量的地址指向棧中的某個地方是非常合理的。這不是特定於x86或gcc - 這是一個相當普遍的想法。

但是,使用指向不存在的變量(即超出範圍之後)的指針是未定義行爲。所以這個函數不能保證做任何有意義的事情。事實上,一個「聰明」的編譯器可以檢測到你的程序使用了未定義的行爲,並用無操作代替你的代碼(稱之爲「性能優化」)。

或者,一個「明智的」編譯器可以識別你的函數返回一個指向堆棧的指針,而是通過使用硬件堆棧指針來代替它。

這兩個選項都不能保證 - 這個代碼是不可移植的。

+2

請注意,僅有一次_having_指針有效的指針本身不是UB。例如,這只是'free(ptr)'返回後的正常狀態。 – MSalters

相關問題