C語言學習篇(5)-----棧(stack)的認識

特別說明的是棧就是棧,堆就是堆,‘棧’和‘堆’是兩種不同的數據結構

,平時我們習慣性叫“堆棧”,只是一種習慣,自己心中應明白其本質的區別!

什麼是棧

棧是一種數據結構,C語言中使用棧來保存局部變量。棧是被髮明出來管理內存的,其有如下特點

  1. 分配的內存小,因此不應該在程序中定義過大的局部變量,如int a[10000],都是不合理的定義
  2. 自動化,即我們在函數內定義(不用static修飾)一個數據(局部變量,入棧)時,會自動分配在棧上,當函數運行結束時,分配的內存會自動被釋放(出棧),無需程序員手動釋放!
  3. FILO先進後出, 入口亦是出口,先入棧的必須後出來,如下圖所示:
C語言學習篇(5)-----棧(stack)的認識

棧的先進後出

棧的應用

大家是否思考過:C語言中,定義局部變量時如果未初始化,則值是隨機的,為什麼呢?

定義局部變量,其實就是在棧中通過移動棧指針來給程序提供一個內存空間和這個局部變量名綁定。因為這段內存空間在棧上,而棧內存是反覆使用的(髒的,上次用完沒清零的),所以說使用棧來實現的局部變量定義時如果不顯式初始化,值就是髒的。因此在定義局部變量時,應養成好的習慣,初始化它,避免出現意想不到的bug。

如何顯式初始化怎麼樣?C語言是通過一個小手段來實現局部變量的初始化的。

int a = 123; // 局部變量定義時初始化

C語言編譯器會自動把這行轉成:

int a; // 局部變量定義

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

棧的約束

  1. 內存空間是有限的,在分配棧時,應考慮實際情況。如果太小怕溢出,太大怕浪費內存(這個缺點有點像數組)。
  2. 棧的溢出危害很大,一定要避免。所以我們在C語言中定義局部變量時不能定義太多或者太大(譬如不能定義局部變量時 int a[10000]; 使用遞歸來解決問題時一定要注意遞歸收斂)

3. 每位程序員應當十分清楚自己當前環境到底為棧空間分配了多少內存,在定義大數據時,到底選擇棧還是堆,心中應有數。


C語言學習篇(5)-----棧(stack)的認識

C語言筆記分享


分享到:


相關文章: