標籤:des ar io 使用 sp for 檔案 問題 bs
一、malloc/calloc
名稱: |
Malloc/calloc |
功能: |
動態記憶體分配函數 |
標頭檔: |
#include <stdlib.h> |
函數原形: |
void *malloc(size_t size); void *calloc(size_t num,size_t size); |
參數: |
size 分配記憶體塊的大小 num 分配記憶體塊的個數 |
傳回值: |
成功返回分配記憶體塊的首地址,失敗返回NULL. |
malloc和calloc都可以分配記憶體區,但malloc一次只能申請一個記憶體區,calloc一次可以申請多個記憶體區.另外calloc會把分配來的記憶體區初試化為0,malloc不會進行初始化.
#include <stdio.h> #include <stdlib.h> main() { int *p=NULL; p=(int *)malloc(sizeof(int)); if(p==NULL) { printf("malloc error/n"); exit(1); } *p=3; printf("%d/n",*p); free(p); } |
二、malloc/calloc
名稱: |
free |
功能: |
動態記憶體釋放函數 |
標頭檔: |
#include <stdlib.h> |
函數原形: |
void free(void *ptr); |
參數: |
ptr 使用malloc或calloc等記憶體配置函數所返回的記憶體指標 |
傳回值: |
無 |
free 可以釋放由malloc或calloc等記憶體配置函數分配的記憶體.當程式很大時,期間可能要多次動態分配記憶體,如果不及時釋放的話,程式將要佔用很大記憶體.
要注意,如果ptr所指記憶體已被釋放或是未知的記憶體位址,則可能有無法預期的情況發生.若參數為NULL,則free不會有任何作用.
三、memset
名稱: |
memset |
功能: |
初始化所指定的記憶體空間 |
標頭檔: |
#include <stdlib.h> |
函數原形: |
void *memset(void *buffer,int c,int count); |
參數: |
buffer 分配的記憶體 c 初始化內容 count 初始化的位元組數 |
傳回值: |
返回指向buffer的指標 |
memset把buffer所指記憶體地區的前count個位元組設定成某個字元的ASCLL值.一般用於給數組,字串等類型賦值.
main() { int *p=NULL; int i; char *q=NULL; p=(int *)malloc(sizeof(int)*10); if(p==NULL) exit(1); memset(p,0,sizeof(int)*10); q=p; for(i=0;i<10;i++) printf("%d",*(q++)); free(p); } |
執行結果是10個0.
四、memcpy
名稱: |
memcpy |
功能: |
拷貝記憶體空間 |
標頭檔: |
#include <stdlib.h> |
函數原形: |
void *memcpy(void *dest,void *src,unsigned int count); |
參數: |
dest 目標記憶體區 src 原記憶體區 count 要複製的位元組數 |
傳回值: |
指向dest的指標 |
memcpy會把src所指記憶體區複製count個位元組到dest所指記憶體區.如果count比src位元組數大,strcpy會拷貝‘/0‘後結束.要注意dest和src不要重疊.
memcpy只是拷貝記憶體空間,不處理空間重疊的問題.
main() { int *p1=NULL; int *p2=NULL; int q; int i; p1=malloc(sizeof(int)*10); if(p1==NULL) exit(1); p2=malloc(sizeof(int)*5); if(p2==NULL) exit(1); memset(p1,0,sizeof(int)*10); memcpy(p2,p1,sizeof(int)*5); q=p2; for(i=0;i<5;i++) printf("%d",*(q++)); free(p1); free(p2); ) |
運行結果為5個0.
五、memmove
名稱: |
memmove |
功能: |
拷貝(移動)記憶體空間 |
標頭檔: |
#include <stdlib.h> |
函數原形: |
void *memmove(void *dest,void *src,unsigned int count); |
參數: |
dest 目標記憶體區 src 原記憶體區 count 要複製的位元組數 |
傳回值: |
指向dest的指標 |
Memmove和函數memcpy函數功能一樣,但只是拷貝記憶體空間,不處理空間重疊的問題.Memmove會處理空間重疊問題.當dest和src重疊時,仍能正確處理,但src內容發生改變.
六、memmove
名稱: |
memcmp |
功能: |
比較兩個記憶體空間的字元 |
標頭檔: |
#include <stdlib.h> |
函數原形: |
int memcmp(void *buf1,void *buf2,unsigned int count); |
參數: |
buf1 記憶體區 buf2 記憶體區 count 要比較的字元數 |
傳回值: |
見下面 |
Memcmp會比較記憶體地區buf1和buf2的前count個位元組.Memcmp回根據ASCLL碼錶順序依次比較.當buf1<buf2時,返回<0;當buf1=buf2時,返回0;當buf1>buf2時,返回>0.
main() { int *p1=NULL; int *p2=NULL; int rt; p1=malloc(sizeof(int)*10); if(p1==NULL) exit(1); p2=malloc(sizeof(int)*10); if(p2==NULL) exit(1); memset(p1,‘a‘,sizeof(int)*10); memset(p2,‘b‘,sizeof(int)*10); rt=memcmp(p1,p2,sizeof(int)*10); if(rt>0) printf("p1>p2); if(rt<0) printf("p1<p2"); if(rt==0) printf("p1=p2"); free(p1); free(p2); } |
運行結果:p1<p2
【轉】C記憶體操作函數