如何使用 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年6月24日

1K+ 次檢視

啟動你的職業生涯

透過完成課程獲得認證

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