簡體   English   中英

C ++-函數中的局部指針變量具有什么類型的存儲持續時間,它們存儲在哪里?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM