2016-10-17 73 views
-4

我想知道爲什麼局部變量不會被重新創建,如果函數被調用?局部變量 - 重新創建

#include <iostream> 

using namespace std; 

void func(void) 
{ 
    int a = 0; 
    cout << &a << endl; 
} 


int main(void) 
{ 
    func(); 
    func(); 
    func(); 
    func(); 
    system("pause"); 
    return 0; 
} 

爲什麼可變a映射每一次到相同的內存地址?

+0

因爲該var是在堆棧上創建的,並且通過代碼的結構,每次調用該函數時,該特定內存塊總是以完全相同的順序使用/釋放。 –

+0

爲什麼不呢? –

+0

請提供參考標準要求不同地址的地方嗎?然後,它保證使用相同的地址。 – Olaf

回答

2

您已經證明,當堆棧處於相同狀態時調用函數時,堆棧變量可能處於相同地址。

爲什麼不在堆棧處於不同狀態時嘗試調用該函數?例如,使之遞歸:

#include <iostream> 

using namespace std; 

void func(int n) 
{ 
    int a = 0; 
    cout << "n=" << n << ": " << &a << endl; 
    if (0 < n) 
     func(n-1); 
} 

int main() 
{ 
    func(5); 
    return 0; 
} 

輸出示例:

n=5: 0x7fff519aa848 
n=4: 0x7fff519aa808 
n=3: 0x7fff519aa7c8 
n=2: 0x7fff519aa788 
n=1: 0x7fff519aa748 
n=0: 0x7fff519aa708 

正如你可以看到,每個調用func()具有在不同狀態下的疊層,因此的a地址可以是不同的各時間。

5

本地變量的地址未由標準定義。從一個呼叫到另一個呼叫可能是相同的,或者可能不同。

在這種情況下,使用此代碼,在您的機器和編譯器中,地址最有可能是相同的,因爲每次調用func時都會調用main,因此每次堆棧佈局相同。如果您要從main調用某個其他功能,然後致電func,則地址很可能會有所不同。

但是,此行爲不能依賴。

4

變量每次都重新創建,但同一個地址被重用,因爲&hellip;那麼,爲什麼不呢?每一次,它都是一個可用的內存位置,沒有別的東西。爲什麼不使用它?如果你每次都需要一個不同的位置,你最終會無緣無故地耗盡內存。對於同一個函數中的同一個變量,您的系統重新使用相同的位置很方便。如果你的程序更復雜,你可能會看到更少的可預測行爲。