c語言有五大儲存空間
**區,靜態儲存區,棧區,堆區、常量區**區:就是存放**的儲存區域,它不涉及**中的變數值。
靜態儲存區:用來存放全域性變數和靜態變數。
棧區:存放函式內的區域性變數,形參和函式返回值。棧區之中的資料的作用範圍過了之後,系統就會**自動管理棧區的記憶體(分配記憶體 , **記憶體),不需要開發人員來手動管理。
堆區:也稱為動態儲存區。這塊區域的記憶體供c語言程式動態申請。通俗地講,也就是我們用malloc族函式申請並用free族函式釋放的記憶體。
常量區:存放常量(程式在執行的期間不能夠被改變的量,例如: 10,字串常量」abcde」, 陣列的名字等)
堆疊詳解
棧:後進先出性質的資料結構,也就是說後存放的先取,先存放的後取。這就如同我們要取出放在箱子裡面底下的東西(放入的比較早的物體),我們首先要移開壓在它上面的物體(放入的比較晚的物體)。
堆:像一棵倒過來的樹,堆是一種經過排序的樹形資料結構,每個結點都有乙個值。通常我們所說的堆的資料結構,是指二叉堆。堆的特點是根結點的值最小(或最大),且根結點的兩個子樹也是乙個堆。由於堆的這個特性,常用來實現優先佇列,堆的訪問是隨意,這就如同我們在圖書館的書架上取書,雖然書的擺放是有順序的,但是我們想取任意一本時不必像棧一樣,先取出前面所有的書,書架這種機制不同於箱子,我們可以直接取出我們想要的書。
要點:棧:由系統自動分配,速度較快。但程式設計師是無法控制的。
堆:是由new分配的記憶體,一般速度比較慢,而且容易產生記憶體碎片,不過用起來最方便。(程式設計師自己分配的,new,malloc)
int a =
0; 全域性初始化區
char
*p1; 全域性未初始化區
main()
效率問題
char s1=
"aaaaaaaaaaaaaaa"
;char
*s2 =
"bbbbbbbbbbbbbbbbb"
;aaaaaaaaaaa是在執行時刻賦值的;放在棧中。
而bbbbbbbbbbb是在編譯時就確定的;放在常量區。
在以後的訪問中,在棧上的陣列比指標所指向的字串(例如堆)快。
堆疊的優缺點簡要
使用棧就象我們去飯館裡吃飯,只管點菜(發出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。static作用.使用堆就象是自己動手做喜歡吃的菜餚,比較麻煩,但是比符合自己的口味,而且自由度大。
1、static宣告函式
只能被模組內的函式呼叫,不能被模組外的函式呼叫。模組可以理解為當前.c檔案。
2、static宣告全域性變數
只能在當前.c檔案中使用。
3、static宣告區域性變數
只能用作當前函式體。
注意!!!static變數可以預設初始化,預設值為0或者"/0"
記憶體問題\
儲存位置
生命週期
作用範圍
static全域性變數
靜態資料區
整個程式執行期間
當前.c檔案
全域性變數
靜態資料區
整個程式執行期間
整個源程式
static區域性變數
靜態資料區
整個程式執行期間
當前函式體
區域性變數
棧函式執行完即被釋放
當前函式體
參考部落格:
C語言程式裡全域性變數 區域性變數 堆 棧
1.實驗環境 1.ubuntu20 全域性變數 靜態區域性變數儲存在全域性資料區,初始化的和未初始化的分別儲存在一起。普通區域性變數儲存在堆疊中。在c c 中,通常可以把記憶體理解為4個分割槽 棧 堆 全域性 靜態儲存區和常量儲存區 1.記憶體棧區stack 存放區域性變數名 2.記憶體堆區heap...
全域性變數區域性變數等的區別以及堆疊
棧 stack 由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。堆 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶。malloc和new等操作實際上就是在堆中申請記憶體,物...
c 全域性變數 區域性變數
全域性變數即在函式外宣告的變數,區域性變數即在函式內部宣告的變數,例如 include float num 3.14 乙個名為num的全域性變數 void main float num 2.45 乙個名為num的區域性變數 cout3.14 當區域性變數和全域性變數同名時,在區域性變數作用域內使用該...