<span style="font-size:14px;">#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *p1;
int *p2;
p2=p1=malloc(sizeof(int));
printf("Please input a number:\n");
scanf("%d", p1);
free(p1);
printf("%d\n", *p2);
return 0;
}</span>
参见上例代码,两个指针p1、p2指向同一个由malloc分配的空间,free掉p1,引用p2时,出现了如下错误:
这是怎么回事呢?
free对应着malloc,当你malloc一块内存时,相当于机器将这块内存借给你,你可以随意使用这块内存,其他程序就不会使用这块内存。而一旦free后,相当于将这块内存还给了机器,机器就可以将这块内存借给其他程序了。p2还是指向了这块内存,成为了野指针,一旦对其进行操作,很可能会破坏其他使用这块内存的程序的数据。
那么如何规避这种风险呢?
可以先将要释放的指针指向NULL,再free。即
<span style="font-size:14px;">#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int *p1;
int *p2;
p2=p1=malloc(sizeof(int));
printf("Please input a number:\n");
scanf("%d", p1);
//先将p1指向NULL再释放
p1=NULL;
free(p1);
printf("%d\n", *p2);
return 0;
}</span>