那年,一步一步学linux c ---浅谈动态内存

转自:http://blog.csdn.net/muge0913/article/details/7314130

那年,一步一步学linux c ---浅谈动态内存

分类: 嵌入式linux c 编程 3487人阅读 评论(8) 收藏 举报


转载请注明出处:http://blog.csdn.net/muge0913/article/details/7314130


使用动态内存时需要用户自己去申请资源和释放资源。用户可以随时的分配所需空间,根据需要分配空间大小,并在最后释放申请内存。

动态内存也存在隐患:在大型的项目当中管理申请的动态内存是很复杂的,以及释放申请的内存有难想起的。在释放动态内存时可能不止一个指针指向了该内存,所以释放的时候是很容易出错的。内存无法释放就会造成内存泄露,这也就是为什么服务器要经常的每个一段时间重启的原因。

内存管理操作:

分配内存函数:


  1. #include <stdlib.h>
  2. void *malloc(size_t size)
  3. void *calloc(size_t nmemb,size_tsize)
#include <stdlib.h>

void *malloc(size_t size)

void *calloc(size_t nmemb,size_tsize)



函数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



内存的释放:

  1. #include<stdlib.h>
  2. voidfree(void *pr);
#include<stdlib.h>

voidfree(void *pr);

free用于释放有malloc或calloc申请的动态内存。内存释放后再去使用指针会发生错误。

实例如下:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. char *alloc_test();
  4. main()
  5. {
  6. char*p1,*p2;
  7. p1= alloc_test();
  8. p2= p1;
  9. printf("%s\n",p1);
  10. printf("%s\n",p2);
  11. free(p1);
  12. //free(p2);
  13. }
  14. char *alloc_test()
  15. {
  16. char*pchar = malloc(20);
  17. strcpy(pchar,"helloalloc_test");
  18. returnpchar;
  19. }
#include <stdio.h>

#include <stdlib.h>

 

char *alloc_test();

 

main()

{

     char*p1,*p2;

     p1= alloc_test();

     p2= p1;

     printf("%s\n",p1);

     printf("%s\n",p2);

     free(p1);

     //free(p2);

}

char *alloc_test()

{

     char*pchar = malloc(20);

     strcpy(pchar,"helloalloc_test");

     returnpchar;

}

要把free(p2);注释掉

否则会出错,以为p1,p2同时指向了一个内存,通过p1释放了内存块,当通过p2再次释放内存当然就出错了。

pchar也指向了内存块,但是又过p1释放的内存,因为调用完alloc_test后pchar配释放了当内存块并没有被释放。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值