【C语言】内存管理基本函数

1. malloc

在这里插入图片描述

  • 开辟成功则返回一个指向size个字节大小空间的指针,失败则返回NULL
  • 注意检查返回值,(尤其VS2019及以上)
  • 返回的指针为无类型指针,使用时注意类型转换
    int* p = (int*)malloc(20);

2. free

在这里插入图片描述

  • 参数为动态内存空间的地址

  • 释放后需手动置空,否则会导致野指针问题
    free(ptr);
    ptr = NULL;

  • 这里ptr指针中的地址并未被改,是其指向的内存空间被回收

  • 如果参数memblock为NULL,则会忽略指针,并立即返回

3. calloc

在这里插入图片描述

  • 参数为元素个数和每个元素字节大小
  • 会将开辟的空间的每个元素初始化为0
  • 其它与malloc不无相同

4. realloc

在这里插入图片描述

  • 参数为待调整内存空间的地址、调整后空间的字节数
  • 可能的情况
    • 原空间之后空间充足,直接追加空间至size大小(原地扩容
    • 原空间之后空间不够,在堆区中另觅一块size大小的空间来使用,并将原有的数据拷贝至这块空间,返回此空间的地址(异地扩容
    • 上述两种情况都不满足,即堆区中没有size大小的可用空间,返回NULL

因此使用realloc时注意检查返回值,并且将结果先存入一个中间变量

int* tmp = (int*)realloc(40);
	if (tmp == NULL)
	{
		printf("realloc fail\n");
		exit(-1);
	}
	else
	{
		memblock = tmp;
	}

5. 常见错误

  • 对NULL指针解引用导致程序崩溃
    (应注意检查开辟空间的返回值)

  • 动态开辟内存空间的越界访问
    (判断空间使用率,需要时进行扩容)

  • free释放内存空间的一部分
    (不应改变内存空间起始位置的地址)

  • 对一块动态内存空间多次释放
    (free后立即置空)

  • 对free后的原内存空间地址解引用操作,造成非法访问内存空间
    (free后立即置空)

  • 忘记释放动态内存空间,造成内存泄漏
    (及时主动释放)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值