C语言内存管理总结

更新: 2018/01/09 增加free()
更新: 2018/04/13 修改部分文字与表格背景色与默认颜色相同

//# TODO: malloc, alloc, calloc, realloc   1F916BF4-7F64-4EAE-B9B1-7ECD00EFF5B2

备注: 晚点补上memset
 C语言跟内存分配方式[1]
 ①  从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。
 ②  在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
 ③  从堆上分配,亦称动态内存分配。程序在运行的时候用mallocnew申请任意多少的内存,程序员自己负责在何时用freedelete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多


 总结  alloc申请的是栈上的内存,无需手动释放。一般不用。
 malloc, calloc, realloc申请的是堆上的内存, 释放完全要靠自己free
 void free(void *p);
   
 alloc  向栈申请内存,函数结束时候自动释放
 无需free
 malloc  void* malloc(unsigned size);
 如果调用成功,函数malloc()和calloc()都将返回所分配的内存空间的首地址。
 malloc, calloc, realloc申请的是堆上的内存, 释放完全要靠自己free
 分配空间  在内存的动态存储区中分配一块长度为“size”字节的连续区域。
 初始化  只分配空间,可能是0也可能是其他
 要自己初始化
 memset(void *b, int  c, size_t  len>)
http://blog.csdn.net/my_business/article/details/40537653
   

 

   
 注意  malloc, calloc, realloc申请的是堆上的内存
 释放完全要靠自己free
 calloc  void* calloc(size_t numElements, size_t sizeOfElement);
如果调用成功,函数malloc()和calloc()都将返回所分配的内存空间的首地址。
 分配空间    calloc()函数有两个参数,分别为元素的数目和每个元素的大小
    这两个参数的乘积就是要分配的内存空间的大小:
    
 初始化   函数calloc() 会将所分配的内存空间中的每一位都初始化为零
   
   
 注意  malloc, calloc, realloc申请的是堆上的内存
 释放完全要靠自己free
 realloc     void* realloc(void* ptr, unsigned newsize);
   
 不稳定   realloc()试图直接从堆上现存的数据后面的那些字节中获得附加的字节
 如果能够满足,自然天下太平;
 如果数据后面的字节不够
 那么就使用堆上第一个有足够大小的自由块,现存 的数据然后就被拷贝至新的位置
 而老块则放回到堆上.
  数据可能被移动.[2]
   
   
注意   malloc, calloc, realloc申请的是堆上的内存
 释放完全要靠自己free
   
   
   
   
   
   
参考: 
[1]《malloc()与 alloc()区别 (转)》,蔚蓝色的天空, 2010/03/22, http://www.cnblogs.com/longyi1234/archive/2010/03/22/malloc.html
[2]《malloc、calloc、realloc的区别》, shuaishuai80, 2011/01/15, http://blog.csdn.net/shuaishuai80/article/details/6140979
 

 

posted @ 2017-06-28 16:50  懒虫哥哥  阅读(134)  评论(0编辑  收藏  举报