自己的理解 堆,棧及變數在記憶體中的分布

2021-05-24 07:06:01 字數 1634 閱讀 6490

參考文章:http://www.cppblog.com/oosky/archive/2006/01/21/2958.html

下文部分是參考的,主要寫部落格,是為了更好的讓自己理解,鞏固知識點。日積月累。

1.

由程式設計師自己申請和釋放 ,內部是不連續的鏈式結構。

c語言中,malloc就是用來從堆中申請記憶體的;c++中,new是用來申請記憶體的。

2.

由編譯器內部申請釋放的記憶體空間。有固定大小。

3.其他知識點

乙個由c/c++編譯的程式,其記憶體主要分為:

a).堆區:malloc,new等申請的記憶體,自己申請,自己釋放。free,delete.

b).棧區:區域性變數(函式內部的變數以及函式的引數)

c).全域性變數區:全域性變數和靜態變數分布的地方。初始化的全域性變數和靜態變數是放在一塊的,未初始化的全域性變數和靜態變數是放在相鄰的另一塊區域內。

d).文字常量區:常量字串放在這兒。程式結束系統自動**。

比如:char array = "abcdefg";//abcdefg/0是放在文字常量區的

e).程式**區: 存放函式體的二進位制**。

4.經典例子:

int a = 0;//全域性變數-----在全域性變數區(初始化區域)

char* p1;//全域性變數-----在全域性變數區(未初始化區域)

void main()

5.附加部分:c語言中變數在記憶體中是如何分布的?

在c語言中,變數可以分為全域性變數,區域性變數,靜態變數,暫存器變數。其中暫存器變數起提示作用,不要取位址。如:register a = 5;printf("%d",&a);

看下面的例子:

int g1=0, g2=0, g3=0;

void main()

0x004174c4

0x004174c8

0x004174c4

0x004174d0

0x004174d4

0x004174d8

0x0012ff60

0x0012ff54

0x0012ff48

由此可以看出,全域性變數和靜態變數在記憶體中在同一塊區域的,而區域性變數與之相差十萬八千里。

6.再看乙個例子

void fun1(int param1,int param2,int param3)

void main()

對於這個例子,可以看出對於函式引數是由從右向左壓入棧的,先壓入param3,再壓入param2,最後壓入param1,根據「先進後出」原理,param3的位址》param2的位址》param1的位址。

而對於下面的區域性變數,可以看出先壓入v1,然後v2,最後v3.

而函式引數比區域性變數更早的壓入棧區。

以上**編譯環境:windowxp + vs08;

以上可能有錯誤,望指正。

記憶體中堆疊的理解

堆疊 在計算機領域,堆疊是乙個不容忽視的概念,但是很多人甚至是計算機專業的人也沒有明確堆疊其實是兩種資料結構。要點 堆 順序隨意 棧 先進後出 堆和棧的區別 一 預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引...

變數在記憶體中的儲存

c 中變數在記憶體中的儲存 一 記憶體大致可以分為三部分 區 堆疊區 靜態資料段。c和c 中有全域性變數,靜態變數以及區域性變數等幾類。全域性變數和靜態變數是在編譯的時候就已經分配好在資料段,也就是說在執行main函式之前就已經分配好了位址,如果定義的時候已經初始化,那麼就存放初始化的值,如果沒有初...

變數在記憶體中的儲存

package com.gxlq.ren 該類表示荊楚的老師 public class jcteacher public void playgame 8種基本型別 整數,小數,布林型別,char 字元型別 n 復合 整數 byte 1 short 2 int 4 long 8 小數 float 4 ...