C语言之野指针产生原因、易错模型、解决办法


1)、产生问题分析:

void main22()

{

        char *p = NULL;

        p = (char *)malloc(100); //char p[100];

        strcpy(p, "abcdefg");

        if (p != NULL)

        {

                  free(p);     //指针所指向的内存空间已经改变、但是指向没有改变 

        }

        if (p != NULL)//指针变量还是指向原来的内存空间,但是内存空间已经被释放

        {

                  free(p);//因此这里再次释放程序就会bug

        }

        system("pause");

}

产生野指针原因的本质:指针变量和它所指内存空间变量是两个不同的概念。

 

2)、解决办法:三步曲

1、定义指针时,把指针变量赋值成NULL

2、释放内存是,先判断指针变量是否为NULL

3、释放完内存后,把指针变量重新复制成NULL

 

 

3)、野指针产生模型图

 

4)、野指针易错难点分析:指针做函数参数

void getMem3(intcount,char *p)

{

   char *tmp =NULL;

   tmp = (char *)malloc(100 *sizeof(char));//char tmp[100];

   p = tmp;

   //在这个场景下,你给形参赋值了,没有给实参赋值 ,因此分配空间的地址并没传给实参

}

void getMem4(intcount,char **p/*out*/)

{

   char *tmp =NULL;

   tmp = (char *)malloc(100 *sizeof(char));//char tmp[100];

   //间接的修改实参

   *p = tmp;

}

//函数调用的时候,这个场景修改不了实参

int FreeMem1(char *p)

{

   if (p == NULL)

   {

      return -1;

   }

   if (p != NULL)

   {

      free(p);

      p =NULL;//只是把形参重置为NULL,但是实参并没有改变

   }

   return 0;

}

int FreeMem2(char **p)    //实参地址传过来了

{

   if (*p == NULL)

   {

      printf("内存已经释放,不会产生野指针\n");

      return -1;

   }

   if (*p != NULL)

   {

      free(*p);

      *p =NULL;//把实参重置为NULL了,再也不会产生野指针了

   }

   return 0;

}

void main()

{

   char *myp =NULL;

   //getMem3(100, myp);

   getMem4(100, &myp);

   strcpy(myp, "hello 123456");

    //FreeMem1(myp);

   FreeMem2(&myp);

   system("pause");

}




产生问题的本质原因指针做函数参数中形参和实参是两个不同的概念

没有真正理解指针做函数参数中地址传递和值传递的区别,这是典型的易错模型.




 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值