C C 與記憶體相關的函式

2021-09-23 23:31:39 字數 3184 閱讀 3893

c語言的標準函式庫與記憶體管理有關的函式從功能上分為兩類:一類是系統對記憶體操作的函式,例如,讀記憶體的函式、寫記憶體函式,如從指定位址向記憶體寫乙個位元組,乙個字或向記憶體讀乙個位元組或乙個字操作;另一類是供使用者動態使用記憶體的函式,例如,分配c程式一塊儲存區,並將該區清零函式;

假如欲設計乙個c程式,要求從乙個檔案讀取一組資料並存放在陣列中。如果無法預先知道檔案中資料的確切數量,或者在再次執行時檔案的數量發生變化,那麼就需要在程式中把陣列定義得足夠大,才能適應上述情況。但這樣做往往導致記憶體空間的浪費。動態分配記憶體可使程式在執行過程中獲得需要的記憶體空間,以便更有效地利用記憶體空間。現將常用記憶體管理函式及其使用分別介紹於下:

功能該函式是分配給c程式一塊儲存區,並將該儲存區消零。程式在呼叫該函式時需要引用兩個引數,分別指出程式分配物件個數和每個物件所需記憶體空間的位元組數。calloc函式返回乙個內儲存區的字元指標,指向所分配記憶體區域的起始位置。若函式呼叫失敗,返回null。呼叫格式calloc(number,size);

說明呼叫此函式後,可占用從記憶體位址number開始的size個字元長度的連續記憶體空間,函式返回指向該空間起始位置的指標。

當記憶體空間不夠分配時,calloc()返回空指標。因此,calloc()是乙個返回值為指向字元的指標的函式。即

char *calloc();

其中number、size為無符號整數,即

unsigned int number size;

應用舉例

應用calloc()函式從堆中申請255個位元組的儲存區,並向該區輸入輸出字串,可編寫如

下程式實現:

#include

#defint n 255

#define s 1

main()

extern char *calloc()

extern char *fgets();

extern int fputs(),free();

char *buffer;

buffer=calloc(n,s);

if (!buffer)

abort("ug,too big \n");

fputs ("enter data follwed by ctrl-z\n),stdout);

while (fgets(buffer,n,sldin))

fputs (buffer,stdout);

free(buffer);

}

呼叫格式

malloc(size);

功能該函式被呼叫後,可占用預先指定了的記憶體區中的size個字元長度的連續記憶體空間,它允許程式按需要分配記憶體,而且恰好分配所需的大小。

說明如果該函式呼叫成功,返回size空間的第乙個位元組的位址,當記憶體空間不夠分配時,返回

null。它也是乙個返回值為指向字元的指標函式,即:

char *malloc();

size也是無符號數,即;

unsigned int size;

malloc()與calloc()的區別是,malloc()只能在指定的記憶體空間中占用size個字元長度的連續空間,而calloc()可在任意的記憶體空間占用size個字元長度連續空間,這個記憶體空間的起始位置在呼叫函式calloc()時,臨時指定。

應用舉例

使用malloc()函式從堆中分配255個位元組儲存區,並對該區清零。

可編寫如下程式實現:

#include

main()

}

呼叫格式

free(pointer);

功能該函式釋放由calloc()或malloc()函式分配的儲存空間,以便下次重新分配,以提高記憶體資源的使用效率。

說明函式free()的呼叫需要乙個指定釋放記憶體空間的指標引數,在程式中應為字元型指標,

即:char *pointer;

如果釋放成功,函式free(pointer)返回值為零:當pointer引數為無效指標,返回值為-

1。呼叫格式

rcalloc(pointersize);

功能該函式用於改變callc()或malloc()所占用的記憶體區的大小,即將calloc()或malloc()

指定的size數改為rcalloc()指定的size指定的size數。

說明該函式呼叫成功返回由pointer指標變數所指向的位址;當記憶體空間不夠分配時,返回值為0。當不需要占用的記憶體空間時,用free()或cfree()釋放。

#include

#include

#define segment 0x0040

#define offset 0x0013

main()

功能 從記憶體指定的段:偏移中讀取乙個位元組。

格式 char peekb(unsigned segment,unsigned offset);

說明 peekb()函式返回相應位址上的乙個位元組的內容。

應用例項 讀取0x40:0x11處的乙個位元組,並分析其硬體裝置的配置情況。可編寫如下程式實現:

#include

#include

#iclude

main()

功能 向記憶體中寫乙個字。

格式 void poke ( unsigned segment,unsigned offset,int value);

說明 其中segment為要寫入記憶體的段位址。offset為要寫入記憶體的偏移量。value為要寫入記憶體的值。

由於poke()函式有修改記憶體資料的能力,所以使用此函式時一定要注意,如果操作錯誤,其結果常常是宕機。出現此類錯誤的原因多是由於指定的段位址、偏移位址的數值不正確或沒有賦予初值,再有就是所寫的數值不被系統所承認。

功能 向記憶體中寫乙個位元組。

格式 void poke (unsigned segment,unsigned offset,char value);

說明 其中segment為要寫入記憶體的段位址,offset為要寫入記憶體的偏移量。value為要寫入內

存的值。

應用例項

從段位址100h處開始寫記憶體5個字的資料,然後逐個字讀取。可編寫如下的程式實現:

#include

main()

}

綜合地使用poke(),pokeb(),peek(),peekb()這四個函式,可以達到控制作業系統的軟體資源的目的。

C C 記憶體拷貝函式

1 char strcpy char dest,const char src 對字串有效,也會將src字串的 0 拷貝至目的字串中,所以在設定目的字串時注意分配合理的記憶體空間 2 char strncpy char dest,const char src,size t count 對字串有效,根據...

C C 記憶體管理與記憶體對齊

判斷大小端 uint32 t word 0xaabbccdd char p char word for int i 0 i 4 i 大端結果 aa bb cc dd 小端結果 dd cc bb aa bss段 bss segment 通常是指用來存放程式中未初始化,或初始化為0的全域性變數,靜態區域...

linux c 記憶體相關函式

calloc 配置記憶體空間 相關函式 malloc,free,realloc,brk 表頭檔案 include 定義函式 void calloc size t nmemb,size t size 函式說明 calloc 用來配置nmemb個相鄰的記憶體單位,每一單位的大小為size,並返回指向第乙...