1. 程式人生 > >不理解為什麽調用一級指針作函數參數時候,就不能把myp1 = NULL,

不理解為什麽調用一級指針作函數參數時候,就不能把myp1 = NULL,

get 指針變量 重新 分配 gpo stdio.h 函數參數 參數 兩個

產生野指針原因的本質:指針變量和它所指內存空間變量是兩個不同的概念。

解決辦法:三步曲

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,