悬空指针能不能访问?

描述

指针被释放后,是不是就变成了空指针?这是很多刚接触指针的同学存在的误区。

我们还是写个代码看下:

char *p = (char *)malloc(sizeof(char) * 128);
  定义一个指针,然后在堆空间申请一块内存,这种赋值方式就表示指针指向堆空间,画出来就是这样的。

内存泄漏  

内存用完之后,还得养成释放的习惯,如果不释放,那这块内存一直被占有,其他人就用不了,这就是所谓的内存泄漏。

释放内存使用函数free,参数就是这块内存的地址。
free(p);
在图上的表现就是,这块内存自由了,如果后面有其他地方要使用内存,那操作系统完全可以把这块内存再分配出去。

内存泄漏  

此时,指针p没有任何的变化,它里面还是保存刚才的地址0x100,只是0x100这块内存已经被释放了,p并不是空指针,我们可以把它称作悬空指针,那悬空指针能不能访问?
char *p = (char *)malloc(sizeof(char) * 128);
free(p);
strcpy(p, "helloworld");
如果你强行去访问的话,就会出现一些未知的问题。

我们在学习的时候,写的代码通常比较少,内存使用的也不多,所以大部分情况下你去访问已经释放的内存好像也没什么问题,其实这是一个误区。

如果把它放到项目中,代码量比较大,内存使用比较多,就会导致一系列意想不到的问题。

所以正确的做法应该是,内存释放后,再加上一条语句:
p = NULL;
把p变成空指针。

虽然空指针也不能通过 * 去访问,但是空指针是可控的,有的时候加上一些判断,就能有效的防止一些意外的发生。






审核编辑:刘清
打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分