C/C++与内存相关的函数
C語(yǔ)言的標(biāo)準(zhǔn)函數(shù)庫(kù)與內(nèi)存管理有關(guān)的函數(shù)從功能上分為兩類:一類是系統(tǒng)對(duì)內(nèi)存操作的函數(shù),例如,讀內(nèi)存的函數(shù)、寫內(nèi)存函數(shù),如從指定地址向內(nèi)存寫一個(gè)字節(jié),一個(gè)字或向內(nèi)存讀一個(gè)字節(jié)或一個(gè)字操作;另一類是供用戶動(dòng)態(tài)使用內(nèi)存的函數(shù),例如,分配C程序一塊存儲(chǔ)區(qū),并將該區(qū)清零函數(shù);
1.動(dòng)態(tài)內(nèi)存分配函數(shù)
假如欲設(shè)計(jì)一個(gè)C程序,要求從一個(gè)文件讀取一組數(shù)據(jù)并存放在數(shù)組中。如果無(wú)法預(yù)先知道文件中數(shù)據(jù)的確切數(shù)量,或者在再次運(yùn)行時(shí)文件的數(shù)量發(fā)生變化,那么就需要在程序中把數(shù)組定義得足夠大,才能適應(yīng)上述情況。但這樣做往往導(dǎo)致內(nèi)存空間的浪費(fèi)。動(dòng)態(tài)分配內(nèi)存可使程序在執(zhí)行過(guò)程中獲得需要的內(nèi)存空間,以便更有效地利用內(nèi)存空間。現(xiàn)將常用內(nèi)存管理函數(shù)及其使用分別介紹于下:
(1)calloc()函數(shù)
功能
該函數(shù)是分配給C程序一塊存儲(chǔ)區(qū),并將該存儲(chǔ)區(qū)消零。程序在調(diào)用該函數(shù)時(shí)需要引用兩個(gè)參數(shù),分別指出程序分配對(duì)象個(gè)數(shù)和每個(gè)對(duì)象所需內(nèi)存空間的字節(jié)數(shù)。calloc函數(shù)返回一個(gè)內(nèi)存儲(chǔ)區(qū)的字符指針,指向所分配內(nèi)存區(qū)域的起始位置。若函數(shù)調(diào)用失敗,返回NULL。調(diào)用格式calloc(number,size);
說(shuō)明
調(diào)用此函數(shù)后,可占用從內(nèi)存地址number開(kāi)始的size個(gè)字符長(zhǎng)度的連續(xù)內(nèi)存空間,函數(shù)返回指向該空間起始位置的指針。
當(dāng)內(nèi)存空間不夠分配時(shí),calloc()返回空指針。因此,calloc()是一個(gè)返回值為指向字符的指針的函數(shù)。即
char *calloc();
其中number、size為無(wú)符號(hào)整數(shù),即
unsigned int number size;
應(yīng)用舉例
應(yīng)用calloc()函數(shù)從堆中申請(qǐng)255個(gè)字節(jié)的存儲(chǔ)區(qū),并向該區(qū)輸入輸出字符串,可編寫如
下程序?qū)崿F(xiàn):
(2)malloc()函數(shù)
調(diào)用格式
malloc(Size);
功能
該函數(shù)被調(diào)用后,可占用預(yù)先指定了的內(nèi)存區(qū)中的size個(gè)字符長(zhǎng)度的連續(xù)內(nèi)存空間,它允許程序按需要分配內(nèi)存,而且恰好分配所需的大小。
說(shuō)明
如果該函數(shù)調(diào)用成功,返回size空間的第一個(gè)字節(jié)的地址,當(dāng)內(nèi)存空間不夠分配時(shí),返回
NULL。它也是一個(gè)返回值為指向字符的指針函數(shù),即:
char *malloc();
size也是無(wú)符號(hào)數(shù),即;
unsigned int size;
malloc()與calloc()的區(qū)別是,malloc()只能在指定的內(nèi)存空間中占用size個(gè)字符長(zhǎng)度的連續(xù)空間,而calloc()可在任意的內(nèi)存空間占用size個(gè)字符長(zhǎng)度連續(xù)空間,這個(gè)內(nèi)存空間的起始位置在調(diào)用函數(shù)calloc()時(shí),臨時(shí)指定。
應(yīng)用舉例
使用malloc()函數(shù)從堆中分配255個(gè)字節(jié)存儲(chǔ)區(qū),并對(duì)該區(qū)清零。
可編寫如下程序?qū)崿F(xiàn):
(3)free()函數(shù)
調(diào)用格式
free(pointer);
功能
該函數(shù)釋放由calloc()或malloc()函數(shù)分配的存儲(chǔ)空間,以便下次重新分配,以提高內(nèi)存資源的使用效率。
說(shuō)明
函數(shù)free()的調(diào)用需要一個(gè)指定釋放內(nèi)存空間的指針參數(shù),在程序中應(yīng)為字符型指針,
即:
char *pointer;
如果釋放成功,函數(shù)free(pointer)返回值為零:當(dāng)pointer參數(shù)為無(wú)效指針,返回值為-
1。
(4)rcalloc()函數(shù)
調(diào)用格式
rcalloc(pointersize);
功能
該函數(shù)用于改變callc()或malloc()所占用的內(nèi)存區(qū)的大小,即將calloc()或malloc()
指定的size數(shù)改為rcalloc()指定的size指定的size數(shù)。
說(shuō)明
該函數(shù)調(diào)用成功返回由pointer指針變量所指向的地址;當(dāng)內(nèi)存空間不夠分配時(shí),返回值為0。當(dāng)不需要占用的內(nèi)存空間時(shí),用free()或cfree()釋放。
2.內(nèi)存讀寫函數(shù)
(1)peek()函數(shù)
功能
從內(nèi)存指定的段偏移地址單元中讀一個(gè)字。
格式
int peek ( unsigned segment,unsigned offset);
說(shuō)明
peek()函數(shù)返回相應(yīng)地址上的一個(gè)字的內(nèi)容。
內(nèi)存各地址是以段地址:偏移地址的格式。例如,0070:0000是絕對(duì)地址×’0700’。
應(yīng)用實(shí)例
利用peek()函數(shù),讀取40:13單元的內(nèi)容(此單元的一個(gè)字記錄著系統(tǒng)存儲(chǔ)器總?cè)萘?以KB為單位)并顯示到屏幕上。可編寫如下的程序?qū)崿F(xiàn):
(2)peekb()函數(shù)
功能 從內(nèi)存指定的段:偏移中讀取一個(gè)字節(jié)。
格式 char peekb(unsigned segment,unsigned offset);
說(shuō)明 peekb()函數(shù)返回相應(yīng)地址上的一個(gè)字節(jié)的內(nèi)容。
應(yīng)用實(shí)例 讀取0X40:0X11處的一個(gè)字節(jié),并分析其硬件設(shè)備的配置情況。可編寫如下程序?qū)崿F(xiàn):
(3)poke()涵數(shù)
功能 向內(nèi)存中寫一個(gè)字。
格式 void poke ( unsigned segment,unsigned offset,int value);
說(shuō)明 其中segment為要寫入內(nèi)存的段地址。offset為要寫入內(nèi)存的偏移量。value為要寫入內(nèi)存的值。
由于poke()函數(shù)有修改內(nèi)存數(shù)據(jù)的能力,所以使用此函數(shù)時(shí)一定要注意,如果操作錯(cuò)誤,其結(jié)果常常是死機(jī)。出現(xiàn)此類錯(cuò)誤的原因多是由于指定的段地址、偏移地址的數(shù)值不正確或沒(méi)有賦予初值,再有就是所寫的數(shù)值不被系統(tǒng)所承認(rèn)。
(4)poded()函數(shù)
功能 向內(nèi)存中寫一個(gè)字節(jié)。
格式 void poke (unsigned segment,unsigned offset,char value);
說(shuō)明 其中segment為要寫入內(nèi)存的段地址,offset為要寫入內(nèi)存的偏移量。value為要寫入內(nèi)
存的值。
應(yīng)用實(shí)例
從段地址100H處開(kāi)始寫內(nèi)存5個(gè)字的數(shù)據(jù),然后逐個(gè)字讀取。可編寫如下的程序?qū)崿F(xiàn):
總結(jié)
以上是生活随笔為你收集整理的C/C++与内存相关的函数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 梦到着火我给浇灭了好不好
- 下一篇: C++对于大型图片的加载缩放尝试