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

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

可以在其范圍之外訪問局部變量的內(nèi)存嗎?

可以在其范圍之外訪問局部變量的內(nèi)存嗎?

犯罪嫌疑人X 2019-05-20 16:04:46
我有以下代碼。#include <iostream>int * foo(){     int a = 5;     return &a;}int main(){     int* p = foo();     std::cout << *p;     *p = 8;     std::cout << *p;}而代碼只是運(yùn)行而沒有運(yùn)行時異常!輸出是 58怎么會這樣?本地變量的內(nèi)存不能在其功能之外無法訪問嗎?
查看完整描述

6 回答

?
翻閱古今

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超5個贊

你在這里做的只是讀取和寫入曾經(jīng)是地址的內(nèi)存a。既然你在外面foo,它只是指向一些隨機(jī)存儲區(qū)的指針。事實(shí)上,在您的示例中,該內(nèi)存區(qū)域確實(shí)存在,此刻沒有其他任何內(nèi)容正在使用它。你不會因?yàn)槔^續(xù)使用它而破壞任何東西,而其他任何東西都沒有覆蓋它。因此,5仍然存在。在一個真實(shí)的程序中,該內(nèi)存幾乎可以立即重用,你可以通過這樣做來破壞某些東西(盡管這些癥狀可能要到很晚才出現(xiàn)!)

當(dāng)您返回時foo,您告訴操作系統(tǒng)您不再使用該內(nèi)存,并且可以將其重新分配給其他內(nèi)容。如果你很幸運(yùn),它永遠(yuǎn)不會被重新分配,并且操作系統(tǒng)不會讓你再次使用它,那么你就可以逃脫謊言。盡管如此,你最終還是會寫完最后的那個地址。

現(xiàn)在,如果你想知道編譯器為什么不抱怨,那可能是因?yàn)?code>foo優(yōu)化消除了。它通常會警告你這類事情。C假設(shè)你知道你正在做什么,從技術(shù)上來說你沒有違反范圍(除了a它之外沒有引用foo),只有內(nèi)存訪問規(guī)則,它只觸發(fā)警告而不是錯誤。

簡而言之:這通常不會起作用,但有時會偶然發(fā)生。


查看完整回答
反對 回復(fù) 2019-05-20
?
九州編程

TA貢獻(xiàn)1785條經(jīng)驗(yàn) 獲得超4個贊

因?yàn)榇鎯臻g還沒有被踩到。不要指望那種行為。


查看完整回答
反對 回復(fù) 2019-05-20
?
至尊寶的傳說

TA貢獻(xiàn)1789條經(jīng)驗(yàn) 獲得超10個贊

所有答案的一點(diǎn)點(diǎn)補(bǔ)充:

如果你做那樣的事情:

#include<stdio.h>#include <stdlib.h>int * foo(){
    int a = 5;
    return &a;}void boo(){
    int a = 7;}int main(){
    int * p = foo();
    boo();
    printf("%d\n",*p);}

輸出可能是:7

這是因?yàn)閺膄oo()返回后,堆棧被釋放,然后由boo()重用。如果您拆卸可執(zhí)行文件,您將清楚地看到它。


查看完整回答
反對 回復(fù) 2019-05-20
?
Qyouu

TA貢獻(xiàn)1786條經(jīng)驗(yàn) 獲得超11個贊

在C ++中,您可以訪問任何地址,但這并不意味著您應(yīng)該訪問。您訪問的地址不再有效。它的工作原理是因?yàn)樵趂oo返回后沒有其他東西擾亂內(nèi)存,但在許多情況下它可能會崩潰。嘗試用Valgrind分析你的程序,或者甚至只是編譯它優(yōu)化,看看......


查看完整回答
反對 回復(fù) 2019-05-20
  • 6 回答
  • 0 關(guān)注
  • 778 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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