日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

内存管理函数

發布時間:2023/12/20 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内存管理函数 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

內存管理函數


宗旨:技術的學習是有限的,分享的精神是無限的。


一、?動態申請內存

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>

2realloc

???????? ——更改已經配置的內存空間

(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、 memcpymemcpy(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、 memsetmemset(buffer, 0, sizeof(buffer));

——初始化指定內存

(1)函數原型

void *memset(void *s, int c, size_t size);

(2)函數參數

? ? ? ? s:待初始化的內存首地址

? ? ? ? c:初始化的值,一般寫0

? ? ? ? size:要初始化的內存大小

(3)返回值

? ? ? ? 執行成功返回s的首地址

bzero與memset:bzero效率高一些。?

總結

以上是生活随笔為你收集整理的内存管理函数的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。