内存管理函数
內存管理函數
宗旨:技術的學習是有限的,分享的精神是無限的。
一、?動態申請內存
1、 malloc/free
——動態分配內存和釋放內存
(1)函數原型
void *malloc(size_tsize); void free(void *str);(2)函數參數
???????? size:要分配的空間大小
(3)返回值
???????? 返回一個指向分配的連續存儲域首地址的指針。失敗返回NULL。
注意:調用free()釋放內存就,不能再去訪問被釋放的內存空間,這塊內存已經不屬于原來的應用程序,此時是懸掛指針,為了安全起見,一般會再次將此指針變量置NULL;不能兩次釋放相同的指針;malloc與free配套使用。
array = (int *)malloc(10 * sizeof(int)); free(array); array = NULL;<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">?</span>2、realloc
???????? ——更改已經配置的內存空間
(1) 函數原型
void *realloc(void *ptr, size_t size);(2)函數參數
? ? ? ? ptr:試圖更改大小的原堆空間位置;
? ? ? ? size:新的內存大小
(3)返回值
? ? ? ? 如果內存減少,malloc僅改變索引信息。
? ? ? ? 如果增加內存,如果當前內存段后面有足夠的內存空間,則直接擴展內存空間,realloc將返回原指針;如果當前內存段后面的字節數不足,那么久使用堆中第一個能夠滿足這一要求的內存塊,將目前的數據復制到新的位置并將原來的數據塊釋放掉,返回新的內存塊地址;失敗返回NULL,此時原來指針仍有效。
new_addr = (int*)realloc(old_addr, 100 * sizeof(int));
?
3、 calloc
——malloc的簡單包裝,把動態分配的內存初始化為0
void*calloc(size_t nmemb, size_t size) {void *p;size_t total;total = nmemb * size;p = malloc(total);if(p != NULL){memset(p, '\0', total);} }// ptr =(struct data *)calloc(count, sizeof(struct data));<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">?</span>4、? alloca
void *alloca(size_t size)
——在棧中分配大小為size的內存,成功返回指針,失敗返回NULL
?
二、內存數據管理函數
1、 memcpy【memcpy(p2, p1, 10);】
——內存拷貝
(1) 函數原型
void *memcpy(void *dst, const void *src, size_t size);(2) ?函數參數
? ? ? ? dst:復制后數據存儲的首地址
? ? ? ? src:數據源地址
? ? ? ? size:復制大小
(3)返回值
? ? ? ? 執行成功返回目的地址。
memcpy()與strncpy():str參數是char *,memcpy參數是void *,memcpy更加強大,strncpy只能用于字符串操作,memcpy不止。void *——“空即是色”——強大。
bcopy()函數類似于memcpy()【bcopy多用于網絡編程中】
void bcopy(const void *src, void *dest,size_t size);<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">?</span>2、 memmove
——memcpy未考慮空間重疊,memmove考慮了。
(1)函數原型
void memmove(void *dst, const void *src, size_t size);(2)函數參數
? ? ? ? dst:復制后數據存儲的首地址
? ? ? ? src:數據源地址
? ? ? ? size:復制大小
(3)返回值
? ? ? ? 執行成功返回目的地址。
memmove函數在復制之前,首先檢查源地址和目的地址是否重疊,有,則進行處理再拷貝,沒有則直接拷貝。
?
3、 memset【memset(buffer, 0, sizeof(buffer));】
——初始化指定內存
(1)函數原型
void *memset(void *s, int c, size_t size);(2)函數參數
? ? ? ? s:待初始化的內存首地址
? ? ? ? c:初始化的值,一般寫0
? ? ? ? size:要初始化的內存大小
(3)返回值
? ? ? ? 執行成功返回s的首地址
bzero與memset:bzero效率高一些。?
總結
- 上一篇: 动态lacp和静态lacp区别_3分钟弄
- 下一篇: i3wm的简单配置