char *xyz()
{
char str[32];
strcpy(str,"Hello there!");
return(str);
}
void main()
{
printf("%s",xyz());
}
當我調用xyz()時,它會返回一個懸掛指針嗎? 謝謝C懸掛指針問題
char *xyz()
{
char str[32];
strcpy(str,"Hello there!");
return(str);
}
void main()
{
printf("%s",xyz());
}
當我調用xyz()時,它會返回一個懸掛指針嗎? 謝謝C懸掛指針問題
是的,它是一個懸掛指針。你的程序調用未定義的行爲。
在某些系統上可能會導致應用程序崩潰,而在其他系統上,它可能會正常工作。但無論如何,你不應該這樣做。
它確實會返回一個懸掛指針。
是的。一般來說,你正在試圖做什麼,一般不鼓勵,但如果你需要做的是做這個:
static char str[32];
,這將確保它的函數退出後保持周圍。
這不是一個真正的通用解決方案。 – 2011-03-11 22:10:53
是的! 它會返回指向「你好!」的指針但是由於xyz()釋放了內存,你不能確定該字符串是否仍然存在,所以它將是懸掛指針!
是的,它會產生一個懸掛指針錯誤。當你調用xyz()時,32 * sizeof(char)字節將被分配到xyz棧幀中的堆棧上。當您在xyz()中工作時,您正在修改和處理已在堆棧中分配的這些字節。
返回(str)調用使用str數組名稱作爲指針,所以實際上將地址返回給str數組。一旦你已經返回,xyz的堆棧框架將被展開,並且xyz對str的本地內存位置不再有效。
回到你的主函數,xyz()的返回值(xyz棧幀中的舊str本地變量的地址)現在傳遞給另一個函數printf。當printf生成它自己的堆棧幀時,它實際上會寫入先前用於將str存儲在xyz()中的內存(因爲這是堆棧中的下一個可用內存)。
**是** 1234567 – pmg 2011-03-11 22:02:59