吧原**編譯成組合語言(機器語言):radsam工具;
佇列:先近先出;
棧:先近後出;棧的大小是由編譯器決定的,預設大小是1m,可以更改,但是一般不建議修改,每個exe都有乙個棧,無法利用較大記憶體,用完立刻**;棧是自動**記憶體;堆必須手動釋放;
棧區存放的是變數;
堆區:動態開闢記憶體;
上面的p在戰棧區,儲存了堆區的某乙個位址;
乙個程式本質上都是由 bss 段、data段、text段三個組成的;程式編譯後生成的目標檔案至少含有這三個段;.text即為**段,為唯讀。.bss段包含程式中
未初始化的
全域性變數和未初始化的static變數
。未初始化的符號在目標檔案的bss段中,而初始化的符號在data段中。
區域性變數存在於(堆疊)中,全域性變數存在於(靜態區)中,動態申請資料存在於(堆)中。
未初始化的全域性變數,static變數,編譯器會自動初始化為0. 這樣可以減少可執行檔案的大小。
區域性變數的值是不確定的。因為使用的時候會先賦值在使用。
bss段:
(bss segment)通常是指用來存放程式中
未初始化的全域性變數、未初始化的靜態變數
的一塊記憶體區域。bss是英文block started by symbol的簡稱。bss段屬於靜態記憶體分配。
text**段:
**段(code segment/text segment)通常是指用來
存放程式執行**
的一塊記憶體區域。這部分區域的**屬於
唯讀。在**段中,
字串常量也屬於這部分。函式在**區;
***data資料段
:資料段(data segment)通常是指用來存放程式中
已初始化的全域性變數
的一塊記憶體區域
。資料段屬於靜態記憶體分配
;data段包含三個部分:
heap(堆)、stack(棧)和靜態資料區
。
堆(heap)
:堆是用於
存放程序執行中被
動態分配的記憶體段
,它的大小並不固定,可動態擴張或縮減
。棧(stack)
:棧又稱堆疊, 是使用者存放程式
臨時建立的區域性變數
,也就是說我們函式括弧「{}」中定義的變數(但不包括static宣告的變數,static意味著在資料段中存放變 量
,),在函式被呼叫時,棧用來傳遞引數和返回值
等。由於棧的先進先出特點,所以棧特別方便用來儲存/恢復呼叫現場。
函式的引數、非靜態區域性變數,返回的位址都在棧區;引數壓棧的順序是從右向左;
靜態資料區:存放的是程式中已初始化的
全域性變數、已初始化的靜態變數和常量;雖然在函式區域性定義常量, 但其儲存位置為靜態資料區而不是區域性棧區。
靜態資料區與程式共存亡,靜態區分配優先於main函式,棧區返回**,反覆釋放;
靜態全域性變數只有當前.c檔案能訪問,
text和data段都在可執行檔案中(在嵌入式系統裡一般是固化在映象檔案中),由系統從可執行檔案中載入;而bss段不在可執行檔案中,由系統初始化。
bss段只儲存沒有值的變數,所以事實上它並不需要儲存這些變數的映像。執行時所需要的bss段大小記錄在目標檔案中,但bss段並不佔據目標檔案的任何空間。
cpu是用於運算和控制的,只能賦中間臨時的值,不能儲存結果;記憶體是用來儲存結果的,只能對儲存結果的記憶體賦值;
register int a;定義乙個暫存器變數;暫存器是在cpu中的,運算速度比記憶體塊;
*****多執行緒
include程序,乙個程序中更可以有多個執行緒;
_beginthread( , , ); 開啟執行緒 ——endthread();結束執行緒
函式存放在**區,函式名存放函式的位址;
記憶體分布:
詳解C語言之堆疊
目錄 a.堆疊是一種特殊的線性表 b.堆疊的資料元素以及資料元素間的邏輯關係和線性表完全相同,其不同點是 線性表允許在任意位置插入和刪除資料元素,但堆疊只允許在固定一端進行插入和刪除資料元素,所以棧又稱為 先進後出 filo 或 後進先出 lifo 的線性表 c.堆疊中允許進行插入和刪除資料元素的一...
C語言之堆疊 回文數
問題描述 123321是乙個非常特殊的數,它從左邊讀和從右邊讀是一樣的。輸入乙個正整數n,程式設計求所有這樣的五位和六位十進位制數,滿足各位數字之和等於n 輸入格式 輸入一行,包含乙個正整數n。輸出格式 按從小到大的順序輸出滿足條件的整數,每個整數佔一行。樣例輸入 52樣例輸出 899998 989...
c語言之佇列結構
佇列是一種操作受限的線性表,其限制條件為允許在表的一端進行插入,而在表的另一端進行刪除。插入的一端叫做隊尾,刪除的一端叫做隊頭。向佇列中插入新元素的行為稱為進隊,從佇列中刪除元素的行為稱為出隊。佇列的特點是先進先出。舉例 火車從山洞一端開進,從山洞另一端開出,車廂好比乙個個元素,最先進入山洞的車廂先...