視頻地址:https://www.bilibili.com/video/av73896748
malloc的基本使用
malloc的函數原型是:
void *malloc( size_t size );
- size:表示要申請的堆空間的大小,單位字節
- 返回值是一個void*類型的指針,malloc會將分配得到的空間的內存首地址返回
之所以採用void*類型指針,是因爲malloc無法提前知道我們申請的空間用於怎樣的類型。因此,通常我們需要將返回值進行指針強轉。
#include <stdlib.h>
int main(int argc, char* argv[])
{
//申請4字節的空間,作爲存儲int變量使用
//申請得到的空間首地址,賦值給pValue指針
int* pValue = (int*)malloc(4);
//修改值
*pValue = 0x11111111;
return 0;
}
我們也可以同時申請大於一個元素的空間地址:
int main(int argc, char* argv[])
{
//申請12字節的空間,作爲存儲3個int變量使用
//申請得到的空間首地址,賦值給pValue指針
int* pValue = (int*)malloc(12);
//修改值
*pValue = 0x11111111;
*(pValue+1) = 0x22222222;
*(pValue+2) = 0x33333333;
return 0;
}
free的基本使用
free的函數原型爲:
void free( void *memblock );
可以看到,free沒有返回值,只有一個參數,我們將之前申請的堆內存首地址傳遞給free即可。
#include <stdlib.h>
int main(int argc, char* argv[])
{
//申請12字節的空間,作爲存儲3個int變量使用
//申請得到的空間首地址,賦值給pValue指針
int* pValue = (int*)malloc(12);
//修改值
*pValue = 0x11111111;
*(pValue+1) = 0x22222222;
*(pValue+2) = 0x33333333;
free(pValue);
return 0;
}
但是要注意,若傳遞給free的地址,並不是之前申請過的堆內存地址,則會出現錯誤。
malloc配合sizeof使用
在實踐中,malloc一般配合sizeof使用,增加代碼的可讀性。
#include <stdlib.h>
int main(int argc, char* argv[])
{
//申請12字節的空間,作爲存儲3個int變量使用
//申請得到的空間首地址,賦值給pValue指針
int* pValue = (int*)malloc(sizeof(int)*3);
//修改值
*pValue = 0x11111111;
*(pValue+1) = 0x22222222;
*(pValue+2) = 0x33333333;
return 0;
}
內存泄漏問題
如果對於堆內存,只申請不釋放,就會造成資源的泄漏。
某些情況,因爲代碼的不規範,會導致無法釋放資源:
void MyFun()
{
int* pValue = (int*)malloc(12);
//修改值
*pValue = 0x11111111;
*(pValue + 1) = 0x22222222;
*(pValue + 2) = 0x33333333;
}
int main(int argc, char* argv[])
{
MyFun();
return 0;
}