簡體   English   中英

局部變量保存相同的內存地址

[英]Local variables hold the same memory addresses

以下程序打印兩個不同變量的地址。

#include <iostream>
using namespace std;

void f1()
{
    int i,k;
    cout<<"f1 : "<<&i<<endl;
}

void f2()
{
    int j;
    cout<<"f2 : "<<&j<<endl;
}

int main() {
    f1();
    f2();
    return 0;
}

現場演示

當我在GCC上運行這個程序時,我想知道,兩個變量都有相同的地址。

為什么兩個變量都保持地址相同?

編輯:

void f1()
{
    int i = 10;
    cout<<"f1 : "<<&i<<endl;
    cout<<"value of  : "<<i<<endl;
}

void f2()
{
    int j;
    cout<<"f2 : "<<&j<<endl;
    cout<<"value of j : "<<j<<endl;
}

int main() {
    f1();
    f2();
    return 0;
}

現場演示2

在此示例中,如果我將值10分配給ij也會打印10 我認為這是無效的,因為j是未初始化的。

因為它們的生命周期不重疊,所以編譯器能夠重用它們的存儲。

他們使用相同的堆棧內存塊。 返回f1調用后,堆棧內存空閑。 然后f2再次獲得相同的堆棧內存。 所以,如果你在另一個函數f3中調用f2,那么你可能會看到不同的地址。

每次調用函數都需要自己的位置來存儲變量。 但是一旦函數返回,變量就不再存在。 地址無法重復使用是沒有理由的。 它不一定是,但沒有理由不能。

堆棧空間用於保存在調用函數時從函數返回所需的信息及其局部變量。 當函數返回時,從堆棧中刪除局部變量,並從堆棧中刪除返回信息,使堆棧返回調用函數時的位置。 由於兩個函數調用是相似的,因此它們在兩種情況下都與堆棧相同,使得局部變量具有相同的地址。

在該示例中,如果我將值10分配給i,則j也打印10.我認為它無效。

在此示例中,您沒有使用c ++的任何內存分配概念。 因此,您剛剛存儲在i的值將保留為從未從為i分配的內存中刪除,然后當您調用fun2 ,將為j分配相同的內存。 這就是為什么你為這兩個變量和同一個地址得到相同的值。

在該示例中,如果我將值10分配給i,則j也打印10.我認為它無效。

關於你的第二個例子(請在問題中發布與問題相關的代碼,不要鏈接'em)

void f2()
{
    int j;
    cout<<"f2 : "<<&j<<endl;
    cout<<"value of j : "<<j<<endl;
}

這是未定義的行為j具有不確定的值,並且任何(*)評估導致不確定的值(在cout<<j call中發生的值)給出未定義的行為。

實際上,這包括具有任意值,陷阱表示(在具有它們的平台上,據我所知,現在肯定不是很多:))並且最糟糕地允許編譯器優化,好像j具有字面上任何值(導致可能是邏輯違規)行為)。

(*)有例外,但在這種情況下不相關

您應該知道變量是本地的不同函數中的局部變量和全局變量的工作原理。

每次調用該函數時,它都會為其分配值和內存地址,因為它存儲在堆棧內存中並通過函數結束進行清理。 內存被釋放,同樣的內存可以再次使用n。

但可能是你的編譯器生氣了。 輸入完整的源代碼然后仔細弄清楚。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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