2017-04-11 31 views
0

鑑於這種代碼:C + +我正確的存儲每個變量的位置?

void myFunction (int * a) { 
    *a = 10; 
} 

int main() { 
    int *b = new int; 
    *b = 20; 
    myFunction(b); 
} 

我說得對不對認爲兩者一個和文字值存儲在堆棧(與一個拿着文字值10的內存地址)?

而且也,是正確地說,b存儲在堆棧而值存儲在堆中?

謝謝!

+2

文字值不存儲在堆棧中,它們被複制那裏當變量被初始化。 – Havenard

回答

0

不完全。 myFunction()收到一個指向堆分配的指針int。因此,雖然a存儲在堆棧中,但數字10存儲在堆中。

因爲ab都是相同的指針,所以同一個指針顯然會一次指向一個地方。

某些其他調用者肯定可以調用myFunction(),將指針傳遞給某些int變量,該變量在本地範圍內聲明,因此存儲在堆棧中。在這種情況下,myFunction()的參數以及它指向的內容將最終駐留在堆棧上。但在這種情況下,指針指向在動態範圍中實例化的int,因此存儲在堆中。

0

從技術上講,C++沒有「堆棧」的概念。相反,適當的術語將是「存儲持續時間」。

對象自動存儲時間段通常被認爲是「存儲在堆棧中」,但這並不意味着有關實際線程堆棧的任何內容。

而是自動存儲時間保證你的對象的生命週期勢必範圍只在定義

你的情況,你有兩個對象具有自動存儲時間:int *b,在main()的範圍界定,和int* amyFunction。這兩個都是int的指針;

你有第三個目的是與new int語句創建一個int;它具有動態存儲持續時間,即存儲在堆上。 ab都用於修改其值。

最後的文字不存儲在所有。一個文字是一個固定值,所以它會被硬編碼到你的二進制文件中。再一次,這並不意味着實際值被「存儲」在二進制文件中,而是編譯器只是說明了使用該值的效果,例如,

a = 0; 

可被編譯爲

xor rax,rax 

其沒有明確提到0

相關問題