產生野指針原因的本質:指針變數和它所指記憶體空間變數是兩個不同的概念。 解決辦法:三步曲 1、定義指針時,把指針變數賦值成NULL 2、釋放記憶體時,先判斷指針變數是否為NULL 3、釋放完記憶體後,把指針變數重新複製成NUL #define _CRT_SECURE_NO_WARNINGS #includ ...
產生野指針原因的本質:指針變數和它所指記憶體空間變數是兩個不同的概念。
解決辦法:三步曲
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;
}