欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言中的堆与malloc和free

程序员文章站 2022-03-04 19:37:28
...

堆与 malloc和free

既然,除了全局区和栈区,其余的去全部为堆区,那么就可以知道,在程序运行过后,堆区的的空间分配是
非常大的。
而堆区的空间是需要动态申请和释放的,我们可以通过C语言标准函数中的malloc和free。来动态申请以及释放堆中的空间。
###malloc函数
函数原型如下:

void *malloc( unsigned int size );

在库函数<stdlib.h>中,使用前请包含<stdlib.h>
malloc接受一个参数,size意味着想要申请的空间的大小。malloc函数会返回一个无解释方式的指针即void *(),指向刚刚申请到的空间的首地址。

#include<stdio.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
int* pValue = NULL;
pValue = (int*)malloc(4);
*pValue = 0x1111111;
*(pValue + 1) = 0x22222222;
return 0;
}

C语言中的堆与malloc和free

如果赋值时显示的上下限不对称是,说明可能越界了。

malloc技巧

我们需要与sizeof配合使用以增强可读性,逻辑性
如:

pValue = (int*)malloc(4*sizeof(int));

特别注意
在使用malloc是一定要使用错误检查,因为在malloc申请空间失败时,会返回0地址
所以为了避免语法malloc失败而造成的风险,务必对返回值进行检查
如果不进行检查:

int* pValue = NULL;
pValue = (int*)malloc(1000000000000);

*pValue = 0x11111111;

该程序会不可控,因为所申请的堆空间过大,在内存不够时,堆空间会申请失败,这就导致pValue的地址为0地址,零地址无法被写入,所以会造成程序出现莫名的错误,导致程序崩溃
C语言中的堆与malloc和free
所以一定要做如下的检查:

int* pValue = NULL;
    pValue = (int*)malloc(10000000000000000000);
    if (pValue == NULL)
    {
        printf("申请失败\r\n");
        return -1;
    }
    *pValue = 0x11111111;
}

以保证程序的安全性

面试题:铪烫屯出现的场景

free函数

函数原型

void free(void *memblock);

语法

free(地址)

将申请到的堆的首地址传递给free,即可完成堆空间的释放。
因为释放后的空间,不应该使用,但是C语言中对于使用释放后的空间这种行为,没
有约束力。
所以,我们强烈推荐,应该按以下代码规范,释放资源:

if (pValue != NULL)
{
free(pValue);
pValue = NULL;
}

free空间后,VS的debug版本会格式化空间,并将内容置为eefe
调试以下代码发现

#include <stdlib.h>
int main(int argc, char* argv[])
{
    int* pValue = NULL;
    pValue = (int*)malloc(4);
    if (pValue == NULL)
    {
        printf("申请失败\r\n");
        return -1;
    }
    *pValue = 0x11111111;
    if (pValue != NULL)
    {
        free(pValue);
        pValue = NULL;
    }
}
  • 申请空间之后,未赋值之前

C语言中的堆与malloc和free

  • 赋值之后,释放之前

C语言中的堆与malloc和free

  • 释放之后
    C语言中的堆与malloc和free

可以看到内存地址的内容被格式化了

相关标签: C语言 c语言