2015-11-07 47 views
-2
int *something() { 
    int x = 5; 
    int *b = &x; 
    return b; 

} 

int main() { 
    int z = *something() 
    printf("%d",z); 

} 

如果堆棧分配稱爲something的功能,則它返回一個值之後,INT X和INT * B被刪除是如何工作的Stack的定義如何工作?

,如果他們被拆除,我們將不能夠尊重指針由something返回,因爲它指出了int x這是從堆棧中刪除

+3

未定義的行爲。 –

+2

我投票結束這個問題作爲題外話,因爲UB dup * 1000 –

+2

在這個問題不可避免地關閉之前...基本上你的直覺在這裏,這不會可靠地工作(正是你給的原因)並且在C中是未定義的行爲。它可能對你有用,這一次是一種僥倖,可能你的編譯器內聯了整個函數,並且只是不斷傳播z = 5; –

回答

0

您的問題是x是一個臨時變量,當它超出在something()末範圍,雖然b指向其地址,b將指向unde當x超出範圍,並且取消引用會導致未定義的行爲。

0

該帖子似乎在問爲什麼這可以工作。答案是, 是的,在something 退出後,局部變量不再有意義,但指針仍然指向。它指向可能包含任何內容的內存位 。所以你會得到一些輸出。它 只是沒有任何意義。

0

函數本身沒有在堆棧中分配。

它有兩個局部變量x和b。

該函數返回一個指向其局部變量x的指針,該指針在退出該函數後被視爲不活動。

但是,直到變量佔用的內存不會被重寫,變量的值纔會出現在那裏。

所以變量z可以得到它的值。

然而,一般來說這是一個未定義的行爲。