不理解為什麽調用一級指針作函數參數時候,就不能把myp1 = NULL,
產生野指針原因的本質:指針變量和它所指內存空間變量是兩個不同的概念。
解決辦法:三步曲
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,