C语言中容易导致指针和内存泄露的几种出错


1. 使用未初始化内存
   char *p = malloc(10);
   //未初始化之前10个字节可能包含垃圾数据,若被访问可能获得垃圾值,导致程序的不可预测的行为。
   良好的实践是通过memset与malloc结合,如下:
   char *p = malloc(10);
   memset(p,'/0',10);
2. 内存覆盖
   对于1中的p分配了10个字节,如果某个代码片段尝试向p写入一个11个字节的值,则该操作将在不告诉的情况下自动从其他某个位置
   “吃掉”一个字节。
   char *p = malloc(10);
   char *q = malloc(11);
   memcpy(p,q,11);
   memcpy操作尝试将11个字节写到p,而后者只分配了10个字节。
3. 内存读取越界
   内存读取越界是指所读取的字节数多于它应有的字节数。
   char *ptr = (char*) malloc(10);
   char name[20];
   memcpy(name,ptr,20);
   memcpy尝试从ptr中读取20个字节,但是只分配了10个字节。
4. 内存泄露
   a.重新赋值
   char *memoryArea = malloc(10);
   char *newArea = malloc(10);
   memoryArea = newArea;
   memoryArea之前指向的内容丢失。
   b.首先释放父指针,而子指针的分配的内存并未释放。
   c.返回值未处理
   char *fun()
   {
    return malloc(20);
   }
   void callfun()
   {
    fun();
   }

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值