当前位置: 首页 > 科技观察

C语言的核心与灵魂

时间:2023-03-15 23:35:55 科技观察

悬垂指针C语言中的指针可以指向一块内存。如果这块内存后来被操作系统回收(释放)了,但是指针仍然指向这块内存,那么,这个时候,指针就是一个“悬空指针”。以下C语言代码为例,请看:void*p=malloc(size);断言(p);免费(p);//现在p是C语言中的“悬挂指针”“悬挂指针”会导致不可预知的错误,而且一旦出现这样的错误,就很难定位。这是因为在free(p)之后,p指针仍然指向之前分配的内存。如果这块内存可以被程序暂时访问到,并且不会造成冲突,那么后面使用p也不会报错。最难调试的错误总是那些不容易重现的错误,对吧?因此,在实际的C语言程序开发中,为了避免“悬空指针”造成不可预知的错误,在释放内存后,往往会为指针p赋值NULL:void*p=malloc(size);assert(p);免费(p);//避免“悬挂指针”p=NULL;这样做的好处是,一旦释放的指针p再次被使用,就会立即引发“segmentationfault”,程序员可以立即知道应该修改C语言代码。上面我们说的“悬空指针”是指向已释放内存的指针,“野指针”是具体指向不确定的指针。“野指针”最常来自未初始化的指针,比如下面的C语言代码:void*p;//此时p是一个“野指针”因为一个“野指针”可能指向任意内存段,它可能会破坏正常的数据,并可能引起其他未知的错误,所以C语言中的“野指针”比“悬挂指针”危害更大。在实际的C语言程序开发中,定义指针时,一般需要避免“野指针”的出现(赋初值):void*p=NULL;void*data=malloc(size);这两点,是C语言比较重要的内容,希望大家在编码的时候一定要注意。