4 回答

TA貢獻1836條經(jīng)驗 獲得超5個贊
myArray
是一個局部變量,因此指針只有在其范圍結(jié)束時(在這種情況下是包含函數(shù)getArray
)才有效。如果您以后訪問它,您將獲得未定義的行為。
在實踐中,發(fā)生的是調(diào)用printf
覆蓋所使用的堆棧的部分,myArray
然后它包含一些其他數(shù)據(jù)。
要修復代碼,您需要在足夠長的范圍內(nèi)聲明數(shù)組(main
示例中的函數(shù))或在堆上分配它。如果在堆上分配它,則需要手動釋放它,或者使用RAII在C ++中釋放它。
我錯過了一個替代方案(可能是這里最好的一個,只要數(shù)組不是太大)就是將數(shù)組包裝成一個結(jié)構(gòu),從而使它成為一個值類型。然后返回它會創(chuàng)建一個在函數(shù)返回后幸存的副本。有關(guān)詳細信息,請參閱tp1的答案。

TA貢獻1946條經(jīng)驗 獲得超3個贊
一旦超出范圍,您就無法訪問本地變量。這就是本地變量的含義。
在replaceNumberAndPrint函數(shù)中訪問數(shù)組時,結(jié)果是未定義的。它似乎第一次工作的事實只是一個幸運的巧合??赡苣阒赶虻膬?nèi)存位置是在堆棧上未分配的,并且仍然為第一次調(diào)用正確設置,但是對printf的調(diào)用然后通過在操作期間將值推入堆棧來覆蓋它,這就是為什么第二次調(diào)用printf會顯示某些內(nèi)容不同。
您需要將數(shù)組數(shù)據(jù)存儲在堆上并傳遞指針,或傳遞到保留在范圍內(nèi)的變量(例如,全局或主函數(shù)內(nèi)的某些范圍)。
- 4 回答
- 0 關(guān)注
- 819 瀏覽
添加回答
舉報