簡體   English   中英

Stack VS Heap,這里有什么?

[英]Stack VS Heap, what goes where here?

所以我開始玩 C,到目前為止玩得很開心。

然而,有幾件事我無法理解。

我知道這最終會在堆棧上

int i = 0;

我知道這將為堆上的 integer 保留空間並返回地址

int *i = malloc(sizeof(int));

然而。 如果我這樣做

int i_one = 1, i_two = 2;
int *arr = calloc(2, sizeof(int));
arr[0] = i_one;
arr[1] = i_two;

i_one 和兩個是堆棧分配的,而 arr 在堆上。 這是否意味着 arr 會將 i_one 和 2 的值復制到堆上,或者它會簡單地保存對堆棧上變量的 2 個引用。 我假設它是 alt 的變體,考慮到(如果我沒記錯的話)我的堆棧分配的整數將在我退出這個 function 后立即被釋放。

總而言之,當使用 calloc 創建動態分配的數組時。 數組中的條目是否也需要分配指針/堆? 在我看來這沒有意義,因為那樣我不會創建一個 int 指針數組嗎? 是的,我知道指針的大小與 int 相同,所以這個例子有點愚蠢,但你明白了。

謝謝

賦值運算符旨在將存儲在一個 object 中的值分配給另一個 object。

所以在這些賦值語句中

arr[0] = i_one;
arr[1] = i_two;

存儲在變量i_onei_two中的值被復制到數組元素arr[0]arr[1]占用的 memory 中。 現在,如果您將更改例如存儲在變量i_one中的值,那么存儲在arr[0]中的值將不會更改。

如果你想在堆中存儲對對象i_onei_two的引用,那么你應該寫

int **arr = calloc(2, sizeof(int *));
arr[0] = &i_one;
arr[1] = &i_two;

現在,您可以通過以下方式通過數組元素arr[0]更改存儲在i_one中的值

*arr[0] = 10;

你這么說

int *i = malloc(sizeof(int));

這將最終在堆上

其實,事情並沒有那么簡單……

如果變量i是 function 內部的局部變量,那么變量本身的空間將位於“自動存儲”中,即堆棧中。 但是malloc返回的指針會指向堆。

我通過打印據我所知的所有相關類型或符號檢查了 memory map(最初我使用 static 庫、動態加載和運行時加載,但它可能有點混亂)。

我還創建了兩個“堆變量”並打印它們的地址和包含它們地址的本地指針

->->-> 所以你可以看到本地指針在堆棧中,但它們的實際地址在堆的開頭。 這就是為什么您可以在堆棧框架之外使用這個分配的變量的原因 - 您的本地指針被刪除但地址保留在堆中。

這是我的程序 output:

 ------------------COMMAND-LINE------------------
 |*envp--------------------->           140737488347777|
 |*argv--------------------->           140737488347751|
 
 |envp--------------------->            140737488346896|
 |argv--------------------->            140737488346864|
 
 
 ------------------STACK------------------
 |str1--------------------->            140737488346090|
 |alloc_second address----->            140737488346048|
 |alloc_first address------>            140737488346040|
 |const_local_second ------>            140737488346032|
 |const_local_first-------->            140737488346024|
 |argc--------------------->            140737488346012|
 ------------------FUNC-STACK-FRAME------------------
 |fun_var_const------------>            140737488345956|
 |fun_var_second----------->            140737488345952|
 |fun_var------------------>            140737488345948|
 
 
 ------------------HEAP------------------
 
 ------------------------MMS---------------------------------------
 |strlen(library func)----->            140737353401952|
 ----------------------------------------------------------------
 
 |alloc_second------------->                4215488|
 |alloc_first-------------->                4215456|
 
 
 ------------------BSS------------------
 |global_const = 0 -------->                4210812|
 |global_int_first--------->                4210808|
 |global_double_first------>                4210800|
 |static_int_first--------->                4210796|
 |global_int_const--------->                4202504|
 
 |------------------DATA------------------
 |static_int_second-------->                4210784|
 |global_double_second----->                4210776|
 ------------------DATA - READ ONLY------------------
 |const_static_int_second-->                4204408|
 |const_static_int_first--->                4204412|
 |string literal----------->                4202700|
 
 
 ------------------TEXT------------------
 |extern function --------->                4200215|
 |function (define after)-->                4200181|
 |main -------------------->                4199038|
 |static function --------->                4198870|
 
 -----------------------BOTTOM LINE------------------
 

暫無
暫無

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

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