C语言之野指针(待更新)

106 阅读1分钟

什么是野指针

指向已经失效地址或者非法地址的指针

假设ptr指向某个数组首地址,free(ptr)之后,此时堆区中的数组空间被释放了,而ptr指针依然指向这个数组原先的首地址。这样会产生什么问题呢?被释放的那段空间的所有权再次还给了系统,系统接下来就很有可能会再次将这段空间分配给别的程序。而我们的ptr指针依然指向着那个地址,这就可能会造成我们再次使用ptr指针的时候访问到了不属于我们的空间,会造成功能异常甚至崩溃,这就是野指针的危害性。

为了防止这种危害性情况发生,在释放掉堆区申请的空间后要将所有(注意是“所有”)指向了那块被释放的空间的指针赋值为NULL,以防止产生野指针的情况。

那刚才释放掉的数组中的内容free执行后就完全删掉了吗?不一定。因为free函数是将这块空间还给系统,系统在没有被再次利用和分配之前,这段被释放的空间的内容依然是可用的。这也是为什么有时候即使访问了野指针指向的空间也能获得正确结果的原因,因为那段空间还没有被再次利用,里面的内容依然是我们原先的内容。