C零基礎視頻-46-malloc與free


視頻地址: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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章