[英]C++ - what type of storage duration do local pointer variables in a function have and where are they stored?
我正在從Storage duration看 C ++中的存儲持續時間類型 。
我只是想知道函數中的本地指針變量具有哪種存儲持續時間,導致函數的非靜態局部變量在塊結束時會被存儲。 但這不適用於指針(在本例中為xPtr
)。 它們將一直存在,直到程序結束,盡管我們無法再次觸摸它。
自動存儲期限。 對象的存儲空間在封閉代碼塊的開頭分配,並在結尾處重新分配。 除聲明為static,extern或thread_local的那些對象外,所有本地對象都具有此存儲時間。
靜態存儲期限。 在程序開始時分配對象的存儲空間,在程序結束時釋放對象的存儲空間。 該對象僅存在一個實例。 在名稱空間范圍內聲明的所有對象(包括全局名稱空間)都具有此存儲期限,以及使用靜態或外部聲明的對象。 有關使用此存儲持續時間初始化對象的詳細信息,請參見非局部變量和靜態局部變量。
我的另一個問題是,為什么系統在第二次進入函數時分配相同的內存地址0x00000041C69EF754
,而該地址仍由xPtr
指向臨時變量x
。
void localPointer()
{
int x = 10;
static int* xPtr = &x; // 0x00000041C69EF754 - 0a 00 00 00 (data the address contains)
std::cout << "end of function" << std::endl;
}
int main()
{
// first enter
localPointer();
/*
the address 0x00000041C69EF754 and its value still
exsit out of the scope of the function localPointer
*/
std::cout << "-----------------------------------------" << std::endl;
// second enter
localPointer();
return 0;
}
您的指針也是一個普通的靜態變量; 當使用new創建指針時,這些指針的值是動態的。
在您的示例中,指針一直指向不變的本地堆棧變量,因為在您輸入函數時會重新創建同一堆棧。
嘗試從另一個級別調用此函數,以便更改RSP值,然后看看會發生什么。 例如,創建另一個函數,然后從中調用該函數。
由於x在堆棧中,因此x的地址是調用堆棧中的地址。 如果在函數退出后嘗試訪問該地址,則可能會得到一些提示,但可能不是您期望的。 您有一個指針,它只是一個數字。 這並不意味着它是一個有效的地址。
如果從另一個函數調用localPointer
,則將看到它指向不同的數據:
void localPointer () {
int x = 7;
static int* ptr = &x;
std::cout << " ptr = " << ptr << ", *ptr = " << *ptr
<< ", x = " << x << ", &x = " << &x << std::endl;
}
void otherFunction() {
int y = 8;
std::cout << " &y = " << &y << std::endl;
localPointer();
}
int main()
{
localPointer();
otherFunction();
localPointer();
}
樣本輸出:
ptr = 0x7ffd8794f13c, *ptr = 7, x = 7, &x = 0x7ffd8794f13c
&y = 0x7ffd8794f13c
ptr = 0x7ffd8794f13c, *ptr = 8, x = 7, &x = 0x7ffd8794f11c
ptr = 0x7ffd8794f13c, *ptr = 7, x = 7, &x = 0x7ffd8794f13c
static關鍵字表示該變量僅在第一次調用該函數時初始化一次,並且在程序執行期間一直存在,或者除非您明確對其進行更改,否則該變量一直存在。
我認為您可能想澄清您想知道的是什么。 將局部變量的地址存儲在靜態中不是一種非常標准的做法-除非您試圖贏得一場混亂的c ++競賽。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.