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