其他分享
首页 > 其他分享> > C零基础视频-46-malloc与free

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

作者:互联网

目录

malloc的基本使用

malloc的函数原型是:

void *malloc( size_t size );

之所以采用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;
}

标签:malloc,46,void,申请,free,int,pValue
来源: https://www.cnblogs.com/shellmad/p/11695697.html