C零基础视频-46-malloc与free

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;
}

猜你喜欢

转载自www.cnblogs.com/shellmad/p/11695697.html