一般来说,我们可以简单的把内存分为三个部分:
(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;如果你是为指针类型的元素分配内存,那么这些元素通常会被初始化为空指针;如果你为实型数据分配内存,则这些元素会被初始化为浮点型的零.