亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何使用指針從不同的函數訪問局部變量?

如何使用指針從不同的函數訪問局部變量?

C++ C
泛舟湖上清波郎朗 2019-05-24 15:21:58
如何使用指針從不同的函數訪問局部變量?我可以在不同的函數中訪問局部變量嗎?如果是這樣,怎么樣?void replaceNumberAndPrint(int array[3]) {     printf("%i\n", array[1]);     printf("%i\n", array[1]);}int * getArray() {     int myArray[3] = {4, 65, 23};     return myArray;}int main() {     replaceNumberAndPrint(getArray());}上面一段代碼的輸出:65 4202656我究竟做錯了什么?“4202656”是什么意思?我是否必須在replaceNumberAndPrint()函數中復制整個數組才能比第一次更多地訪問它?
查看完整描述

4 回答

?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

myArray是一個局部變量,因此指針只有在其范圍結束時(在這種情況下是包含函數getArray)才有效。如果您以后訪問它,您將獲得未定義的行為。

在實踐中,發生的是調用printf覆蓋所使用的堆棧的部分,myArray然后它包含一些其他數據。

要修復代碼,您需要在足夠長的范圍內聲明數組(main示例中的函數)或在堆上分配它。如果在堆上分配它,則需要手動釋放它,或者使用RAII在C ++中釋放它。

我錯過了一個替代方案(可能是這里最好的一個,只要數組不是太大)就是將數組包裝成一個結構,從而使它成為一個值類型。然后返回它會創建一個在函數返回后幸存的副本。有關詳細信息,請參閱tp1答案。


查看完整回答
反對 回復 2019-05-24
?
智慧大石

TA貢獻1946條經驗 獲得超3個贊

一旦超出范圍,您就無法訪問本地變量。這就是本地變量的含義。

在replaceNumberAndPrint函數中訪問數組時,結果是未定義的。它似乎第一次工作的事實只是一個幸運的巧合。可能你指向的內存位置是在堆棧上未分配的,并且仍然為第一次調用正確設置,但是對printf的調用然后通過在操作期間將值推入堆棧來覆蓋它,這就是為什么第二次調用printf會顯示某些內容不同。

您需要將數組數據存儲在堆上并傳遞指針,或傳遞到保留在范圍內的變量(例如,全局或主函數內的某些范圍)。


查看完整回答
反對 回復 2019-05-24
?
不負相思意

TA貢獻1777條經驗 獲得超10個贊

一離開getArray,myArray就會超出范圍。您需要在堆上為它分配空間。


查看完整回答
反對 回復 2019-05-24
  • 4 回答
  • 0 關注
  • 837 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號