目錄
1.malloc和free
2.calloc
3.realloc
?文章來源地址http://www.zghlxwxcb.cn/news/detail-814656.html
1.malloc和free
C語言提供了一個(gè)動(dòng)態(tài)內(nèi)存開辟的函數(shù)malloc:
void* malloc(size_t size);
這個(gè)函數(shù)向內(nèi)存申請(qǐng)一塊連續(xù)可用的空間,并返回指向這塊空間的指針。
?如果開辟成功,則返回一個(gè)指向開辟好空間的指針。
?如果開辟失敗,則返回一個(gè)NULL指針,因此malloc的返回值一定要做檢查。
返回值的類型是 void* ,所以malloc函數(shù)并不知道開辟空間的類型,具體在使用的時(shí)候使用者自己來決定。
如果參數(shù) size 為0,malloc的行為是標(biāo)準(zhǔn)是未定義的,取決于編譯器。
C語言提供了另外一個(gè)函數(shù)free,專門是用來做動(dòng)態(tài)內(nèi)存的釋放和回收的,函數(shù)原型如下:
void free(void* ptr);
free函數(shù)用來釋放動(dòng)態(tài)開辟的內(nèi)存。
?如果參數(shù) ptr 指向的空間不是動(dòng)態(tài)開辟的,那free函數(shù)的行為是未定義的。
?如果參數(shù) ptr 是NULL指針,則函數(shù)什么事都不做。
malloc和free都聲明在 stdlib.h 頭文件中。 舉個(gè)例子:
#include <stdio.h>
#include <stdlib.h>
int main()
{
//代碼1
int num = 0;
scanf("%d", &num);
int arr[num] = {0};
//代碼2
int* ptr = NULL;
ptr = (int*)malloc(num*sizeof(int));
if(NULL != ptr)//判斷ptr指針是否為空
{
int i = 0;
for(i=0; i<num; i++)
{
*(ptr+i) = 0;
}
}
free(ptr);//釋放ptr所指向的動(dòng)態(tài)內(nèi)存
ptr = NULL;//是否有必要?有必要,防止異常訪問
return 0;
}
2.calloc
C語言還提供了一個(gè)函數(shù)叫 calloc , calloc 函數(shù)也用來動(dòng)態(tài)內(nèi)存分配。原型如下:
void* calloc(size_t num, size_t num);
函數(shù)的功能是為 num 個(gè)大小為 size 的元素開辟一塊空間,并且把空間的每個(gè)字節(jié)初始化為0。
與函數(shù) malloc 的區(qū)別只在于 calloc 會(huì)在返回地址之前把申請(qǐng)的空間的每個(gè)字節(jié)初始化為全0。
舉個(gè)例子:
#include<stdio.h>
#include<stdlib.h>
int main()
{
int *p = calloc(10, sizeof(int));
if(NULL != p)
{
//使用空間
}
free(p);
p = NULL;
return 0;
}
可以看到calloc把申請(qǐng)的空間初始化為零,所以如何我們對(duì)申請(qǐng)的內(nèi)存空間的內(nèi)容要求初始化,那么可以很方便的使用calloc函數(shù)來完成任務(wù)。
3.realloc
void* realloc(void* ptr, size_t size);
#include <stdio.h>
#include <stdlib.h>
int main()
{
int *ptr = malloc(100);
if(ptr != NULL)
{
? ? //業(yè)務(wù)處理
}
else
{
? ? exit(EXIT_FAILURE); ? ?
}
//擴(kuò)展容量
//代碼1
ptr = realloc(ptr, 1000);//這樣可以嗎?(如果申請(qǐng)失敗會(huì)如何?)
//代碼2
int*p = NULL;
p = realloc(ptr, 1000);
if(p != NULL)
{
ptr = p;
}
//業(yè)務(wù)處理
free(ptr);
return 0;
}
?文章來源:http://www.zghlxwxcb.cn/news/detail-814656.html
?
到了這里,關(guān)于【C語言】動(dòng)態(tài)內(nèi)存函數(shù)介紹的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!