栈内存特点
1、空间实现自动管理:运行时空间自动分配,运行结束空间自动回收,栈被称为自动管理区;
2、能够被反复使用:占内存在程序中都是一块内存空间,程序通过自动开辟和自动释放,会反复使用这一块空间;
3、脏内存:栈内存由于反复使用,每次使用后程序不会自动去清空内容,下一次该空间再次被分配时,上一次使用的值还在;
4、临时性:函数不能返回栈变量的指针,因为这个空间在函数运行结束后会被释放。
堆内存特点
1、灵活:堆是另一种管理形式的内存区域,堆内存的管理灵活;
2、内存量大:堆内存空间很大,可以按需申请;
3、程序手动申请和释放:如申请malloc释放free;
4、脏内存:与栈内存相同;
5、临时性:堆内存只在malloc后free前的期间才可被访问;
6、如果未及时释放申请的内存空间,会造成内存泄漏(内存名存实亡)。
附malloc、calloc、realloc使用方法和区别
1.malloc:
使用:void *malloc(size_t size);
注:空间申请成功后返回空间首字节地址,申请失败则返回NULL,因此使用malloc时一定要检查是否为NULL;malloc(4)默认最小以16B为单位进行空间分配。
区别:只能动态申请固定大小的内存
2.calloc:
使用:void *calloc(size_t nmemb, size_t size);
区别:动态申请固定大小的内存且返回内存初始化为0
3.realloc:
使用:void *realloc(void *ptr, size_t size);
区别:可修改已分配的内存块的大小