在 C/C++ 中,區域性變數的記憶體可以在其作用域之外訪問嗎?


讓我們來看一個例子,你可能會在其中訪問區域性變數記憶體超出其作用域。

示例

#include<iostream>
int* foo() {
   int x = 3;
   return &x;
}

int main() {
   int* address = foo();
   cout << *address;
   *address = 12;
   cout << *address;
}

輸出

這可能會給出以下輸出:

3
12

正如我之前提到的,這段程式碼可能會執行。我們只是讀取和寫入曾經是 x 地址的記憶體。在 main 函式中,你在 foo 函式的作用域之外,該地址是指向某個隨機記憶體區域的指標。在上面的例子中,該記憶體區域確實存在,並且目前沒有任何其他內容正在使用它。你繼續使用它不會破壞任何東西(你不會使用另一個程序的記憶體區域或任何其他未經授權的記憶體區域),並且沒有任何其他內容已覆蓋它。因此,3 仍然在那裡。

在一個真實的程式中,該記憶體可能幾乎立即被重新使用,而你可能會因為這樣做而破壞某些東西。這種記憶體訪問錯誤很難追蹤和解決。

當你從 foo 函式返回時,程式會告訴作業系統 x 的記憶體不再被使用,並且可以將其重新分配給其他內容。如果你很幸運,它被重新分配了,並且作業系統沒有抓住你再次使用它,那麼你就可以逃脫。

更新於:2020年2月11日

瀏覽量:146

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.