malloc、calloc、realloc的区别

本文详细介绍了程序内存管理中的三个主要部分:堆、栈和静态区。分别讲述了它们的特点、用途及如何通过malloc、calloc和realloc来分配和释放内存,并强调了不当操作可能导致的问题。
一般来说,我们可以简单的把内存分为三个部分:

   (1)堆(heap也称堆栈):由malloc系列函数(malloc、realloc、calloc等)或new操作符分配的内存。其生命周期由free或delete决定。在没有释放之前一直存在,直到程序结束。其特点时使用灵活,空间较大,但容易出错。

   (2)栈(stack):保存局部变量。栈上的内容只在函数范围内存在,当函数运行结束之后,这些内容会被自动销毁。其特点是效率高,但是空间有限。

   (3)静态区:保存自动全局变量和staic变量(包括static全局和局部变量)。静态区的内容在整个程序的生命周期都存在,由编译器在编译的时候分配。


  由malloc、realloc、calloc所申请的内存就在堆上,都需要由free释放,不然会造成内存泄漏甚至程序崩溃。
 三者函数原型

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

2:calloc的函数原型(参数分别为第一个元素数目,第二个元素大小):
void *calloc( size_t num, size_t size );

3:realloc的函数原型 (要扩充的参内存大小的指针名,新的大小):
void *realloc( void *memblock, size_t size );

区别:

   (1)malloc不能初始化所申请的内存空间,而calloc能够。

这里写图片描述

   (2)realloc可以对给定的指针所指的空间进行扩大或者缩小,无论是扩张或是缩小,原有内存的中内容将保持不变.当然,新申请的空间的大小如果小于原来的大小,就会导致数据丢失。

这里写图片描述

    (3)realloc申请的内存后面还有足够多剩余内存的话,realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址; 假如原来的内存后面没有足够多剩余内存的话,realloc将申请新的内存,然后把原来的内存数据拷贝到新内存里,原来的内存将被free掉,realloc返回新内存的地址。当给realloc设置的参数指针若为NULL或者0时就相当于malloc的作用



   (4)calloc所申请的空间内容初始化,如果你是为字符类型或整数类型的元素分配内存,那么这些元素将保证会被初始化为0;如果你是为指针类型的元素分配内存,那么这些元素通常会被初始化为空指针;如果你为实型数据分配内存,则这些元素会被初始化为浮点型的零.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值