c语言动态内存管理

malloc

函数原型:
void* malloc(size_t size)

  • 如果开辟成功,则返回一个指向开辟好空间的指针。
  • 如果开辟失败,则返回一个NULL指针。
  • 返回值的类型是void*,所以malloc函数并不知道开辟空间的类型,具体在使用时由使用者决定。
  • 如果参数size为0,malloc函数的行为是标准未定义的,由编译器决定。
    因此,在使用malloc函数时,对返回值一点要做检查

既然申请了内存,就需要释放内存。
函数原型:
void* free(void* ptr)

  • 如果参数ptr是NULL指针,则该函数什么都不做。
  • 如果参数ptr指向的空间不是动态开辟的,那么free函数的行为是未定义的。

使用时的注意事项:

  • 申请一次,释放一次。整体申请,整体释放。
  • 已经free过的空间无法再被free掉,指针仍指向这段内存区域。
  • free之后的内存区域不能在被使用。该指针需要置为空指针,否则会变为野指针(悬垂指针)。
  • free之后的内存实际比malloc申请的多一部分,原因:需要有多一部分来管理该段内存。
int *ptr=NULL;
ptr=(int*)malloc(num*sizeof(int));
if(NULL!=ptr)
{
    //
}
free(ptr);
ptr=NULL;

calloc

函数原型:void* calloc(size_t num,size_t size);

  • 函数的功能是为num个大小为size的元素开辟一块空间,并且把空间的每个字节初始化为0;
  • 与malloc的区别:calloc会在返回地址之前把申请的空间的每个字节初始化为0;
  • 根据实际情况,malloc比calloc快。
int *p=calloc(10,sizeof(int));
if(NULL!=p)
{
    //
}
free(p);
p==NULL;
return 0;

realloc

函数原型:void* realloc(void* ptr,size_t size);

  • realloc函数可以对动态开辟内存大小进行调整。
  • ptr是要调整的内存地址。
  • size为调整之后的大小
  • 返回值为调整之后的内存空间的起始地址
  • 这个函数除了会调整内存空间的大小之外,还会将原来的数据移动到新的内存空间。
    此时:就会出现两种情况
    1.原有空间之后有足够大的空间。
    2.原有空间之后没有足够大的空间。
  • 情况1时:直接在原有内存之后追加空间,原来的空间数据不发生变化。
  • 情况2时:在堆空间上另找一个合适大小的连续空间来使用,函数返回一个新的内存地址。
int *ptr=malloc(100);
if(ptr!=NULL)
{
    //
}
else
{
    exit(EXIT_FAILURE);
}
//扩展容量
int *ptr=NULL;
p=realloc(ptr,1000);
if(p!=NULL)
{
    ptr=p;
}
//

free(ptr);
return 0;
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值