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"); } |
产生问题的本质原因:指针做函数参数中形参和实参是两个不同的概念。
没有真正理解指针做函数参数中地址传递和值传递的区别,这是典型的易错模型.