第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

C++ C
泛舟湖上清波郎朗 2019-05-24 15:21:58
如何使用指針從不同的函數(shù)訪問局部變量?我可以在不同的函數(shù)中訪問局部變量嗎?如果是這樣,怎么樣?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()函數(shù)中復制整個數(shù)組才能比第一次更多地訪問它?
查看完整描述

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答案。


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

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)的某些范圍)。


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

TA貢獻1777條經(jīng)驗 獲得超10個贊

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


查看完整回答
反對 回復 2019-05-24
  • 4 回答
  • 0 關(guān)注
  • 819 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學習伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號