C語言全域性變數 區域性變數 堆疊等記憶體問題詳解

2021-10-21 05:55:34 字數 1955 閱讀 4004

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 當區域性變數和全域性變數同名時,在區域性變數作用域內使用該...