1. 程式人生 > >C語言:位元組排序與記憶體四區(II)

C語言:位元組排序與記憶體四區(II)

一. 接著I開始:
這四個區分別對應的是程式碼區、全域性變數區、堆區、棧區。
這裡寫圖片描述

各區的詳細說明如下:

1、棧區(stack):由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方
式類似於資料結構中的棧。
2、堆區(heap: 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由OS回 收 。
注意它與資料結構中的堆是兩回事,分配方式倒是類似於連結串列。
3、資料區:主要包括靜態全域性區和常量區,如果要站在彙編角度細分的話還可以分為很多小的區。
全域性區(靜態區)(static):全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變
量和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。
程式結束後有系統釋放
常量區 :常量字串就是放在這裡的。 程式結束後由系統釋放
4、程式碼區:存放函式體的二進位制程式碼。

記憶體中的這四個區的相互協調工作流程如:
這裡寫圖片描述

二.棧區(stack)與堆區(heap)的探討
1.c中有著太多的自動變數會頻繁地定義與釋放,因此用棧來存放c中的自動變數是一個不二之選,當在程式碼中宣告自動變數的函式或函式塊執行結束後,這些自動變數就不能夠再繼續使用,而佔用的記憶體地址也會被立刻的釋放。自動變數重複使用記憶體區域,因此自動變數的地址是不一定的。
2.棧除了分配自動變數的記憶體區域外(重複使用該區域,節省記憶體),還有著一個非常非常重大的功能,用來實現函式的“遞迴呼叫”,遞迴呼叫在c中佔有著非常重的位置。何為遞迴呼叫?就是函式自己呼叫自己。
3.為了搞清楚自動變數在棧中如何儲存,以及以何種放在被存放?下面用一段程式碼來測試:(附:棧的開口可以向上、亦可以向下,計算機多采用棧的開口向下)

#include<stdio.h>
#include<stdlib.h>
void func(int a,int b){
  int c,d;
  printf("func:&a:%p  func:&b:%p\n",&a,&b);
  //打印出形參a,b的地址
  printf("func:&c:%p  func:&d:%p\n",&c,&d);
  //列印區域性變數c,d地址
}
int main(int argc,char *argv[]){
  int a,b;
  printf("main:&a:%p
main:&b:%p\n"
,&a,&b); //列印main()中的區域性變數a func(3,5); system("pause"); return 0; }

編譯執行結果如下:
這裡寫圖片描述

各變數在棧中的記憶體地址如圖:
這裡寫圖片描述

當func(3,5)函式被呼叫時,其棧的使用情況為:

這裡寫圖片描述

4.關於堆,使用malloc()、realloc()、calloc()等分配的記憶體區域(free()釋放). 一個值得重視的就是:“碎片化”,碎片化就是記憶體被分割得零零碎碎,出現很多的細碎的空快,並且這些空快區域是無法被利用到的。

相關推薦

C語言位元組排序記憶體II

一. 接著I開始: 這四個區分別對應的是程式碼區、全域性變數區、堆區、棧區。 各區的詳細說明如下: 1、棧區(stack):由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方 式類似於資料結構中的棧。 2、堆區(heap: 一般

C語言位元組排序記憶體I

I.位元組排序概念: 位元組順序是指佔記憶體多於一個位元組型別的資料在記憶體中的存放順序,通常有小端(Little-endian)、大端(Big-endian)兩種位元組順序。小端位元組序指低位元組資料存放在記憶體低地址處,高位元組資料存放在記憶體高地址處;大

C語言 資料結構排序查詢 資料結構實驗之排序bucket sort

資料結構實驗之排序三:bucket sort Time Limit: 250MS Memory Limit: 65536KB Submit Statistic Problem Description 根據人口普查結果,知道目前淄博市大約500萬人口,你的

C語言氣泡排序和選擇排序

pdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQzNjUyMTU2,size_16,color_FFFFFF,t_70)

C語言氣泡排序升序排序

任務程式碼: 數字的排序: #include <stdio.h> #define SIZE 10 int main() { int a[SIZE]={12 ,43,9,13,67

C語言控制結構流程圖

任務程式碼: #include <stdio.h> #include <math.h> int main() { float fHeight,fStandar_Weight

C語言插入排序

#include <stdio.h>int main(){int a[10] = {0};//定義一個數組並初始化int i;//定義一個迴圈變數int j;//定義一個迴圈變數int temp;//定義一個人臨時變數printf("Please input 10 numbers:\n");//迴

C語言函式宣告定義的引數不一致問題,後果可能很嚴重哦!!!!!

  具體:在檔案main.c中 int func ();     //宣告中沒引數 int main(){         int c = func();            //呼叫時也不傳參,這樣才能編譯通過         printf("%d\n",c);    

C語言實現位元組十六進位制字串的相互轉換

//位元組流轉換為十六進位制字串void ByteToHexStr(const unsigned char* source, char* dest, int sourceLen){    short i;    unsigned char highByte, lowByte;    for (i = 0; i

C語言指標陣列陣列指標的區別

指標陣列是指:存放指標的陣列 陣列指標是指:指向一個數組的指標(是指標變數) 下面具體分析一下: (1)指標陣列:int *p[10]; 因為[ ]的優先順序高,所以[ ]先與p結合成為一個數組,然後這個陣列的型別為int*,也就是整形指標,該陣列含有10個指標型別的陣

C語言連結屬性儲存型別

一、 連結屬性C語言中連結屬性決定如何處理在不同檔案中出現的標示符。標示符的作用域與它的連結屬性有關,但這兩個屬性並不相同。連結屬性有3種: external(外部),internal(內部) 和 none(無)。1. none: 沒有連結的標示符,總是被當做單獨的個體,也就

C++雜記運行時類型識別RTTI動態類型轉換原理

程序包 bar ons Language 值類型 包括 iat www != 運行時類型識別(RTTI)的引入有三個作用: 配合typeid操作符的實現; 實現異常處理中catch的匹配過程; 實現動態類型轉換dynamic_cast。 1. typeid操

C#語言中數組集合的區別以List集合為例

類型 添加元素 list 添加 一個 保存 操作方法 適用於 length 數組用於保存固定數量的數據,定長,占用內存少,遍歷速度快; 集合保存的數據數量,可以在程序的執行過程中,不斷發生變化,不定長,占用內存多,遍歷速度慢; 在功能上,數組能實現的所有功能,集合都能實現;

C語言判斷兩字串的大小關係strcmp法

題目來源:大工慕課 連結 作者:Caleb Sung 參考解答 邏輯非常簡單,這裡不再贅述: #include<stdio.h> #include<string.h>

objective-c 中數據類型之 字典NSDictionary

bject ted ray 初始化 -c lec com lock led // 1. 字典初始化、賦值方式1 NSMutableDictionary *m_dictionary = [[NSMutableDictionary alloc] initWithCa

2017百度之星資格賽 1003度度熊邪惡大魔王DP

solution nav normal ner 就會 預處理 display badge rate 度度熊與邪惡大魔王 Accepts: 3021 Submissions: 18787 Time Limit: 2000/1000 MS (Java/Ot

面向物件【林老師版】多型多型性十三

一、多型 多型指的是一類事物有多種形態,比如 1、動物有多種形態:人,狗,豬 import abc class Animal(metaclass=abc.ABCMeta): #同一類事物:動物 @abc.abstractmethod def talk(self):

【軟體開發底層知識修煉】三 深入淺出處理器之三 記憶體管理記憶體管理單元MMU

上一篇文章學習了中斷的概念與意義,以及中斷的應用-斷點除錯原理。點選連結複習上一篇文章:中斷的概念與意義 本片文章繼續學習處理器相關的知識-記憶體管理。包括:記憶體管理單元MMU的作用,虛擬記憶體與實體記憶體之間的對映方式,頁表的概念,快取記憶體(Cache)的作用,實體記憶體與快取

分析簡單的c語言函式編譯得到的X86彙編程式碼VS2013

檢視原始碼生成的彙編程式碼:單步除錯->除錯->視窗->反彙編   總結: ①、函式被呼叫時,實參值賦值給函式棧中的形參,使用以下步驟:        I、call函式前實參值壓棧    &n

Java 記憶體區域記憶體溢位異常

一、虛擬機器中Java物件的建立 語言層面上,建立Java物件通常僅僅是一個new關鍵字而已。 在虛擬遇到new指令時: 1、首先檢查這個指令的引數是否能在常量池中定位到一個類的符號引用,並檢查這個類的符號引用代表的類是否已經載入,解析和初始化過。如果沒有,則必須執行類