[英]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_one
和i_two
中的值被復制到數組元素arr[0]
和arr[1]
占用的 memory 中。 現在,如果您將更改例如存儲在變量i_one
中的值,那么存儲在arr[0]
中的值將不會更改。
如果你想在堆中存儲對對象i_one
和i_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.