转载请注明出处:http://blog.csdn.net/muge0913/article/details/7314130
使用动态内存时需要用户自己去申请资源和释放资源。用户可以随时的分配所需空间,根据需要分配空间大小,并在最后释放申请内存。
动态内存也存在隐患:在大型的项目当中管理申请的动态内存是很复杂的,以及释放申请的内存有难想起的。在释放动态内存时可能不止一个指针指向了该内存,所以释放的时候是很容易出错的。内存无法释放就会造成内存泄露,这也就是为什么服务器要经常的每个一段时间重启的原因。
内存管理操作:
分配内存函数:
函数malloc中size是分配内存的大小,以字节为单位。
函数calloc中size是数据项的大小,nmemb是数据项的个数。所以分配内存大小为size*nmemb
malloc和calloc的最大区别是calloc会把申请到的内出初始化为0
调用成功都会返回分配内存的指针,调用失败都返回NULL
内存的调整:
对于realloc(),函数原型是void* realloc(void*ptr,size_t size),改变ptr所指内存区域的大小为size长度,size可以大于或小于原动态内存的大小,realloc通常是在原数据的基础上调整动态内存的大小是,原数据内容不变。当size大于原来的数据,且在原来位置无法调整时,realloc会重新开辟内存,把原来的数据复制到这来。如果重新分配成功则返回指向被分配内存的指针,否则返回空指针NULL。当内存不再使用时,应使用free()函数将内存块释放。有一点需要注意:当分配内存成功之后,应将原本的指针ptr=NULL,否则会形成野指针,可能造成系统崩溃。不论是以上那种方式申请内存,在申请内存之后,最终都要用free释放空间,不然会造成内存泄漏。
如果ptr为NULL时realloc相当于malloc,如果size=0时相当于free
内存的释放:
free用于释放有malloc或calloc申请的动态内存。内存释放后再去使用指针会发生错误。
实例如下:
要把free(p2);注释掉
否则会出错,以为p1,p2同时指向了一个内存,通过p1释放了内存块,当通过p2再次释放内存当然就出错了。
pchar也指向了内存块,但是又过p1释放的内存,因为调用完alloc_test后pchar配释放了当内存块并没有被释放。
分享到:
相关推荐
Linux下C语言编程--时间概念 Linux下C语言编程--时间概念 Linux下C语言编程--时间概念 Linux下C语言编程--时间概念
Linux下C语言编程--进程的创建
对Linux下C语言编程--线程操作作了详细的说明
基于LINUX系统下c语言-----学生管理系统common.h文件.rar
mysql-connector-c-6.1.11-linux-glibc2.12-x86_64.rar
linux学习(青少年学Linux)-2019-11-10 linux学习(青少年学Linux)-2019-11-10 linux学习(青少年学Linux)-2019-11-10 linux学习(青少年学Linux)-2019-11-10 linux学习(青少年学Linux)-2019-11-10
linux下C语言编程4-使用共享内存实现进程间通信
对Linux下C语言编程--进程通信、消息管理作了详细的解答
linux下的c语言-网络-网络编程面试题.pdf
对Linux下C语言编程--文件的操作编程作了详细的说明和给出了很好的例子
对Linux下C语言编程--信号处理函数作了详细的说明,看了对Linux下的信号处理操作有一个清晰地认识
linux下的c语言-网络-网络编程面试题[文].pdf
C++ 是在C语言的基础上发展起来的,学完C语言就学了 C++ 的一半了。 Qt 还存在 Python、Ruby、Perl 等脚本语言的绑定, 也就是说可以使用脚本语言开发基于 Qt 的程序。开源社区就是这样,好东西就会被派生扩展,...
Linux内存管理--Linux物理内存三级架构.pdf
linux 64位 mysql-5.6.39-linux-glibc2.12-x86_64.tar.gz
linux下的c语言-网络-网络编程面试题
linux下C语言编程4-使用共享内存实现进程间通信.pdf
linux 下得jdk-6u27-linux-i586-rpm.bin
第1章 韦凯峰零基础学习Linux C程序设计 - 选择Linux C编程
一步一步学 Linux