2011-03-11 110 views
5
char *xyz() 
{ 
    char str[32]; 
    strcpy(str,"Hello there!"); 
    return(str); 
} 


void main() 
{ 
    printf("%s",xyz()); 
} 

當我調用xyz()時,它會返回一個懸掛指針嗎? 謝謝C懸掛指針問題

+5

**是** 1234567 – pmg 2011-03-11 22:02:59

回答

11

是的,它是一個懸掛指針。你的程序調用未定義的行爲。

在某些系統上可能會導致應用程序崩潰,而在其他系統上,它可能會正常工作。但無論如何,你不應該這樣做。

4

它確實會返回一個懸掛指針。

4

是的。一般來說,你正在試圖做什麼,一般不鼓勵,但如果你需要做的是做這個:

static char str[32]; 

,這將確保它的函數退出後保持周圍。

+0

這不是一個真正的通用解決方案。 – 2011-03-11 22:10:53

2

是的! 它會返回指向「你好!」的指針但是由於xyz()釋放了內存,你不能確定該字符串是否仍然存在,所以它將是懸掛指針!

5

是的,它會產生一個懸掛指針錯誤。當你調用xyz()時,32 * sizeof(char)字節將被分配到xyz棧幀中的堆棧上。當您在xyz()中工作時,您正在修改和處理已在堆棧中分配的這些字節。

返回(str)調用使用str數組名稱作爲指針,所以實際上將地址返回給str數組。一旦你已經返回,xyz的堆棧框架將被展開,並且xyz對str的本地內存位置不再有效。

回到你的主函數,xyz()的返回值(xyz棧幀中的舊str本地變量的地址)現在傳遞給另一個函數printf。當printf生成它自己的堆棧幀時,它實際上會寫入先前用於將str存儲在xyz()中的內存(因爲這是堆棧中的下一個可用內存)。