码迷,mamicode.com
首页 > 其他好文 > 详细

不理解为什么调用一级指针作函数参数时候,就不能把myp1 = NULL,

时间:2018-01-27 20:17:43      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:本质   span   ==   空间   int   释放   class   print   bsp   

 

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

 

解决办法:三步曲

 

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

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

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

#define  _CRT_SECURE_NO_WARNINGS 
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

 

//你上面分配内存,总得给释放掉 二级指针法

int  getMem_free(char **myp1)
{
char *tmp1 = NULL;


if (myp1==NULL)
{
return -1;
}
tmp1 = *myp1;
free(tmp1);//释放完指针变量 所致的内存空间
tmp1 = NULL;//把实参改成NULL
return 0;
}
//一级指针法
int  getMem_free0(char *myp1)
{


if (myp1 == NULL)
{
return -1;
}


free(myp1);//释放完指针变量 所致的内存空间
//不明白这里点
//myp1 = NULL;//???
return 0;
}
int  main0801()
{
int ret = 0;
char *p1 = NULL;
int len1 = 0;


char *p2 = NULL;
int len2 = 0;
ret =  getMem(&p1,&len1,&p2,&len2);
printf("p1:%s\n",p1);
printf("len1:%d\n", len1);
printf("p2:%s\n", p2);
printf("len2:%d\n", len2);
//getMem_free(&p1);//释放内存
//getMem_free(&p2);


getMem_free0(p1);//在被调用函数中,把p1所指向的内存给释放掉,但是实参p1不能被修改成NULL, 有野指针情况发生

getMem_free0(p2);

//发现就是因为上面 myp1 = NULL; 导致p1和p2产生野指针 打印就会出现乱码,不是很懂这里意思
printf("p1:%s\n", p1);
printf("len1:%d\n", len1);
printf("p2:%s\n", p2);
printf("len2:%d\n", len2);

system("pause");
return 0;
}

不理解为什么调用一级指针作函数参数时候,就不能把myp1 = NULL,

标签:本质   span   ==   空间   int   释放   class   print   bsp   

原文地址:https://www.cnblogs.com/LiuKan/p/8366917.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!