目錄:上篇:(3條訊息) 動態記憶體管理(上)_執久呀的博客-CSDN博客
動態函式的介紹:malloc free calloc realloc
三、 calloc函式
calloc函式介紹:
calloc的使用例子:
四、 realloc函式
realloc函式介紹:
realloc函式的使用例子
動態函式的介紹:malloc free calloc realloc
三、calloc函式
函式的引數形式: void* calloc(size_t num , size_t size )
其中void*是一個可以接受任意型別的指標,size_t表示的是unsigned int(無符號整型)
num表示的是多少個元素,size表示的是一個元素的大小,單位是位元組,
calloc函式介紹:
1. calloc函式也是向記憶體申請空間的,若是申請成功則會回傳一個指向記憶體首地址的指標,
若是申請失敗,則會回傳一個NULL(空指標),所以使用該函式也是需要進行判斷是否為
非空指標,否則程式會出錯,
2.calloc函式和malloc函式不同之處在于,calloc函式會將所申請到的記憶體空間全部
初始化成0,而malloc函式則不會,這就意味著calloc比malloc運行時間更長,
所以在選擇這兩個函式時可以根據是否需要初始化來選擇,
calloc的使用例子:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *ptr=(int*)calloc(10,sizeof(int));//用ptr指標來接受calloc回傳的值,申請的空間是40位元組
if(ptr==NULL)
{
return 0;//如果沒申請成功則直接結束函式,
}
else//為ptr非空的情況
{
for(int i=0;i<10;i++)
{
int kc=*(prt+i)=i;//將所申請的空間賦值
printf("%d ",kc);//列印每個元素
}
}
free(ptr);//釋放所申請的記憶體空間,如不則容易導致記憶體泄漏
ptr=NULL; //ptr還是指向原來所申請的地址,free不會將指標變為空,為了安全手動變為NULL
return 0;
}
四、realloc函式
函式的引數形式:void* realloc(void*ptr , size_t num);
其中void*ptr是要被改變的指標指向的地址,size_t num是改變之后的大小,單位是位元組
realloc函式介紹:
1.realloc是一個專門用來調整申請動態記憶體的大小,(也是要和free函式配套使用)
2.若realloc要擴大申請的空間,如果原始空間后有位置可追加則就在原指標之后進行追加,
如果不夠則另外找一塊新的空間來,并且把存在舊的記憶體里的資料移動到新的記憶體空間,
并且釋放舊的記憶體空間給作業系統,回傳一個指向新的記憶體地址的指標,
3. realloc改變所申請空間的大小和上述函式類似,若申請失敗則回傳一個空指標,所以
要判斷所回傳的值是否為非空,若為非空指標,則可以*ptr=*p,
(其中*ptr為舊的指標*p為新的指標)
注:若是將空指標賦值給*ptr,則原始內容地址將丟失(記憶體泄漏)
4.realloc函式功能較強大還可以實作malloc函式的功能,如 void* realloc(NULL,size_t size);
就是只需對NULL進行追加即可,它等價于void* malloc(size_t size);
realloc函式的使用例子:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int* ptr=(int*)calloc(5,sizeof(int));//申請了5個int型別的記憶體,用ptr去接受回傳來的指標
if(ptr!=NULL)
{ for(int i=0;i<5;i++)
{
int input= *(ptr+i)=i;
printf("%d ",input);
}
}
int*p=(int*)realloc(ptr,40);//原ptr申請為10個int型別
if(p==NULL)//這步判斷不可少
{
return 0;//若申請失敗則直接退出函式
}
else
{
ptr=p;//將新地址賦給舊的地址
for(int i=5;i<10;i++)
{
int hi= *(ptr+i)=i;
printf("%d ",hi);
}
}
free(ptr);//釋放申請的記憶體給作業系統,這步必不可少,
ptr=NULL;//切斷ptr和已經釋放的記憶體空間的聯系,
return 0;
}
祝愿各位小伙伴們學有所成!!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298113.html
標籤:其他
上一篇:作業系統NO.2 | 詳解作業系統的非連續記憶體管理(清華大學 作業系統原理)
下一篇:linux作業實戰中的常用命令
