記憶體管理之棧stack

2022-09-01 01:30:14 字數 1206 閱讀 8418

1、什麼是棧

棧是一種資料結構,c語言中使用棧來儲存區域性變數。棧是被發明出來管理記憶體的。

2、棧管理記憶體的特點(小記憶體、自動化)

先進後出  filo   first in last out  棧

先進先出  fifo   first in first out      佇列

棧的特點就是入口就是出口,只有乙個口,另乙個口是堵死的。所以先進來的必須後出去。

佇列的特點就是入口和出口都有,必須從入口進去,從出口出來。所以先進來的必須先出去,不然就會堵住後邊的。

3、棧的應用舉例:區域性變數

c語言中的區域性變數是用棧來實現的。

我們在c語言中定義乙個區域性變數時(int a),編譯器就會在棧中分配一段空間(4位元組)給我們區域性變數使用(分配時

棧頂指標會移動給出空間,給區域性變數a使用的意思就是,將4個位元組的棧記憶體的記憶體位址和我們定義的區域性變數名a給關聯

起來),對應棧的操作就是入棧。

注意:這裡棧指標的移動和記憶體分配是自動的(棧自己完成,不用我們寫**去操作)。

然後等我們函式退出的時候,區域性變數要滅亡。對應棧的操作就是彈棧(出棧)。出棧時也是棧頂指標移動將棧空間中

與a關聯的那4個位元組空間釋放。 這個動作也是棧自動完成的,也不用人寫**干預。

棧的優點:棧管理記憶體,好處是方便,分配和最後**都不用程式設計師操心,c語言自動完成。

分析乙個細節:c語言中,定義區域性變數如果沒有初始化,則值是隨機的,為什麼?

定義乙個區域性變數,其實就是在棧中通過移動棧指標來給程式提供乙個記憶體空間和這個區域性變數名繫結。因為這段記憶體空間

在棧上,而棧記憶體是反覆使用的(也就是上次用完沒有清零),所以說使用棧來實現的區域性變數定義時,如果沒有初始化,

那麼變數的值就是隨機的。

c語言是通過乙個小手段來實現區域性變數初始化的:

int a = 15;         //區域性變數定義時初始化

c語言編譯器會自動把這行**轉換成:

int  a;          //區域性變數定義

a = 15;          //普通的賦值語句

4、棧的約束

首先,棧是有大小的。所以棧記憶體大小不好設定。如果太小怕溢位,太大怕浪費記憶體。(這個缺點有點像陣列)

其次,棧的溢位危害是很大的,所以我們一定要避免。在定義區域性變數的時候不能定義的太多或者是太大。(譬如:

int a[10000];使用遞迴來解決問題時一定要注意遞迴收斂)

堆 head 棧 stack 記憶體分配

簡單的可以理解為 堆 heap 是由malloc之類函式分配的空間所在地。位址是由低向高增長的。棧 stack 是自動分配變數,以及函式呼叫的時候所使用的一些空間。位址是由高向低減少的。預備知識 程式的記憶體分配 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自...

STL容器之stack棧

棧 statck 這種資料結構在計算機中是相當出名的。棧中的資料是先進後出的 first in last out,filo 棧只有乙個出口,允許新增元素 只能在棧頂上增加 移出元素 只能移出棧頂元素 取得棧頂元素等操作。在stl中,棧是以別的容器作為底部結構,再將介面改變,使之符合棧的特性就可以了。...

C STL容器之棧stack

c stack 堆疊 是乙個容器的改編,它實現了乙個先進後出的資料結構 filo 使用該容器時需要包含 include標頭檔案 定義stack物件的示例 如下 stacks1 stacks2 1.入棧 如s.push x 2.出棧 如 s.pop 注意 出棧操作只是刪除棧頂的元素,並不返回該元素。3...