2013-02-20 71 views
0
#include <iostream> 

int* retPointer() 
{ 
    int x=10; //same as auto int x =10; 
    return &x; 
} 

int main(int argc, char **argv) 
{ 
    std::cout<<"x="<<*retPointer()<<std::endl; 
    return 0; 
} 

在上面的示例中,我返回了一個指向堆棧的局部變量的指針。當我在man()中打印這個指針指向的值時,我應該得到一個seg-fault。當我從函數retPointer()返回時,變量x應該超出範圍。所以當嘗試訪問main()中的值時,我是否應該得到分段錯誤?我在這裏錯過了什麼嗎?超出範圍時堆棧上的局部變量未被刪除

輸出是= X = 10

+3

歡迎使用未定義的行爲。 – WhozCraig 2013-02-20 15:46:09

+0

您確定這可行嗎?那麼,堆棧幀會丟失,但在函數終止後內存仍然存在,但實際上它不應該發生...... – 2013-02-20 15:47:46

+0

標準說哪裏應該得到seg-fault? – 2013-02-20 15:52:39

回答

0

當我打印由該指針在人指出()的值,然後我應該得到一個SEG-故障。

你應該?規範中哪裏說這會發生?

您正在調用未定義的行爲。 任何東西都可能發生。

6

x對象確實從retPointer()返回時,和解除引用一個指針一個對象,其使用壽命已經期滿是未定義行爲超出範圍。

有未定義行爲的程序意味着什麼可能發生,包括碰撞,表現得好像什麼都沒有發生(如*retPointer()恢復正常值如10),或格式化您的硬盤驅動器。

雖然最後一個選項是不太可能的,但您確實要做而不是想在程序中有未定義的行爲。不要使用自動存儲返回指向本地對象的指針或引用。