C語言的記憶體分配

2021-06-07 14:18:46 字數 3015 閱讀 9676

文章一、c語言的記憶體分配模型

1、程式**區:存放函式體的二進位制**。  

2、全域性區資料區:全域性資料區劃分為三個區域。全域性變數和靜態變數的儲存是放在一塊的,初始化的全域性變數和靜態變數在一塊區域,未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。常量資料存放在另乙個區域裡。這些資料在程式結束後由系統釋放。我們所說的bss段(bss segment)通常是指用來存放程式中未初始化的全域性變數的一塊記憶體區域。bss是英文block started by symbol的簡稱。

3、棧區:由編譯器自動分配釋放,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。

4、堆區:一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os**。注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶,呵呵。

5、命令列引數區:存放命令列引數和環境變數的值。   

關於區域性的字串常量是存放在全域性的常量區還是棧區,不同的編譯器有不同的實現。可以通過組合語言察看一下。不過vc環境下,區域性常量就像區域性變數一樣儲存於棧中,全域性常量、字元常量儲存於文字常量區。tc在常量區。

在linux下:可以通過引數-c來編譯生成彙編檔案。如:  

gcc -c *.c

gcc *.o -map test.txt -o test.elf

用文字編輯器檢視test.txt檔案,你就看到那些bss段,data段,text段等資訊了,但是沒有堆疊段相關資訊,用objdump命令檢視.o檔案的反彙編後的資訊,或者用gcc -s *.c,檢視各個.s檔案就明白了。

文章二、記憶體的規劃種類

1)常規內(conventional memory)在記憶體分配表中占用最前面的位置,從0kb到640kb(位址000000h~109ffffh),共佔640kb的容量。因為它在記憶體的最前面並且在dos可管理的記憶體區,我們又稱之為low dos memory(低dos記憶體),或稱為基本記憶體(base memory),使用此空間的程式有bios、dos作業系統、外圍裝置的驅動程式、中斷向量表、一些常駐的程式、空閒可用的記憶體空間、以及一般的應用軟體都可在此空間執行。

2)高位記憶體(um)是英文upper memory的縮寫,是常規記憶體上面的一層記憶體(640kb~1024kb)。   

4)emb 是英文extended memory block(擴充套件記憶體塊)的縮寫,早期採用的擴充儲存器(epm)必須遵循ems規範(如使用emm386.exe),後來使用的擴充套件儲存器(exm)必須遵循xms規範(如使用himem.sys)。擴充套件記憶體是指1mb以上的記憶體空間,其位址是從100000h開始,連續不斷向上擴充套件的記憶體,擴充套件記憶體取決於cpu的定址能力。

文章三、

常規記憶體函式

申請函式:malloc(),farmalloc(),calloc(),farcalloc(),realloc(),farealloc()

函式名: malloc

功  能: 記憶體分配函式

用  法: void *malloc(unsigned size);

函式名: farmalloc

功  能: 從遠堆中分配儲存塊

用  法: void far *farmalloc(unsigned long size);

函式名: calloc

功  能: 分配主儲存器

用  法: void *calloc(size_t nelem, size_t elsize);

函式名: farcalloc

功  能: 從遠堆疊中申請空間

用  法: void far *farcalloc( unsigned long units, unsigned ling unitsz );

函式名: realloc

功  能: 重新分配主存

用  法: void *realloc(void *ptr, unsigned newsize);

函式名: farrealloc

功  能: 調整遠堆中的分配塊

用  法: void far *farrealloc( void far *block, unsigned long newsize );

使用函式:memcpy(),memset(),memmove(),movedata()

函式名: memcpy

功  能: 從源source中拷貝n個位元組到目標destin中

用  法: void *memcpy(void *destin,void *source,unsigned n);

函式名: memset

功  能: 設定s中的所有位元組為ch, s陣列的大小由n給定

用  法: void *memset(void *s, char ch, unsigned n);

函式名: memmove

功  能: 移動一塊位元組

用  法: void *memmove(void *destin,void *source,unsigned n);

函式名: movedata

功  能: 拷貝位元組

用  法: void movedata(int segsrc, int offsrc, int segdest, int offdest, unsigned numbytes);

釋放函式:free(),farfree()

函式名: free

功  能: 釋放已分配的塊

用  法: void free(void *ptr);

函式名: farfree

功  能: 從遠堆中釋放一塊

用  法: void farfree(void);

指標操作函式:mk_fp(),fp_off(),fp_seg()

函式名: mk_fp

功  能: 設定乙個遠指標

用  法: void far *mk_fp(unsigned seg, unsigned off);

函式名: fp_off

功  能: 獲取遠位址偏移量

用  法: unsigned fp_off(void far *farptr);

函式名: fp_seg

功  能: 獲取遠位址段值

用  法: unsigned fp_seg(void far *farptr);

C語言記憶體分配

c語言的記憶體分配主要有5個區域 1 棧區 在執行函式時,函式內的區域性變數 不包括static變數 函式返回值的儲存單元在棧區上建立。函式執行結束時這些儲存單元自動被釋放。棧區記憶體分配運算內置於處理器的指令集中,效率很高,但分配的記憶體容量有限。2 堆區 程式在執行的時候用malloc call...

C語言記憶體分配

c語言的記憶體分配主要有5個區域 1 棧區 在執行函式時,函式內的區域性變數 不包括static變數 函式返回值的儲存單元在棧區上建立。函式執行結束時這些儲存單元自動被釋放。棧區記憶體分配運算內置於處理器的指令集中,效率很高,但分配的記憶體容量有限。2 堆區 程式在執行的時候用malloc call...

C語言記憶體分配

objective c從名字來看就可以知道是一門超c語言,所以了解c語言的記憶體模型對於理解objective c的記憶體管理有很大的幫助。c語言記憶體模型圖如下 從圖中可以看出記憶體被分成了5個區,每個區儲存的內容如下 棧區在什麼時候釋放記憶體呢?我們通過下面的乙個例子來說明下 void prin...