程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> C語言中的堆棧小議

C語言中的堆棧小議

編輯:關於C語言
 

當你使用Ruby或者python時,你僅僅需要定義對象或者變量,而不用去關心它們在哪裡.你不用去關心它是在堆(stack)還是在棧(heap)中.也許你選擇的語言根本就不把變量放在棧中.

C是不同的,因為它使用真正的CPU時鐘完成工作,它涉及到一塊叫做堆的內存以及一塊叫做棧的內存.它們之間有什麼不同?這取決於你從哪裡獲得存儲空間.

堆很容易解釋,它就是電腦的剩余內存,你可以通過malloc函數得到更多的空間.每次調用malloc函數,OS利用內部函數為你注冊一小塊內存,同時返回指向這塊內存的指針.當你使用完畢後,使用free函數將它返還給OS,以便它可以被其它的程序使用.如果不這樣做(執行free釋放空間)的話,就會造成內存洩漏.

棧是一塊特殊的內存,它用來存儲作為每個函數定義的局部變量的臨時變量.函數的每個參數都會被入棧,然後在函數內部使用.它是一個真正的棧數據結構,所以,最後入棧的最先出棧.這通常發生在類似main函數中像char action和int id這樣的局部變量上.使用棧的好處是很簡單,當函數退出時,C編譯器將這些變量出棧.這樣既方便,當變量在棧中又可以防止內存洩漏.

簡單總結來說就是,如果一塊內存,你不是用malloc或者在一個函數中用malloc得到的,那麼它就是在棧中.

使用堆棧主要遇到的主要有下面三個問題:
•如果你通過malloc得到一塊內存,然後在棧中有一個指針指向這塊內存,當函數退出時,這個指針就會被出棧,然後消失.
•如果你在棧中放了太多的數據(例如大的結構體或者數組),可能會引起’棧溢出’問題,導致程序退出.如果遇到這種情況,就使用堆.
•如果你使用指針指向一些棧中的東西,然後將此指針當做參數傳遞或者返回值返回,接收這個指針的函數就會遇到”segmentation fault” (segfault)錯誤,因為真正的數據已經被出棧並且消失.指針現在指向的是一個不存在的空間.

 
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved