【C语言】野指针

前言:在学习C语言或者开放工程时,我们常会听到“野指针”这个概念,那么什么是野指针?野指针产生的原因是什么?野指针的危害是什么?我们又要如何去规避野指针呢?这章内容我们就将学习以上内容。

文章目录

  • 一,什么是野指针?
  • 二、野指针产生的原因(C语言中常见)
    • 1.局部指针变量没有初始化
    • 2.使用已经释放过的指针
    • 3.指针指向的变量在使用之前就被销毁了
  • 三,野指针的危害
  • 四,如何规避野指针
  • 五,面试题


一,什么是野指针?

野指针是指向位置随机的(乱指一气),错误的指针,系统无法对其进行操作。野指针指向的值是非法的内存地址,指向的内存是不可用的。

二、野指针产生的原因(C语言中常见)

1.局部指针变量没有初始化

我们如果没有手动去初始化全局变量,全局变量会自动初始化为0,而局部变量不会。所以如果我们不将局部指针变量手动初始化为NULL,那么这个局部指针将会是一个野指针,指向一块非法内存地址,系统无法对其进行操作。

2.使用已经释放过的指针

这个错误常见于动态开辟的内存空间,我们使用malloc等动态内存函数后,都要用free函数对其开辟的动态内存空间进行释放,并将其置为空指针,如果我们用了free函数把那块动态内存空间释放了(还给操作系统了),但是还没置将指针变量为空指针就去使用该指针,就会造成非法访问内存。

3.指针指向的变量在使用之前就被销毁了

最常见于“返回栈空间地址”这一问题,在函数中,如果我们返回局部变量指针,就会造成问题,因为函数调用结束后,局部变量就会被销毁。

三,野指针的危害

1.指向不可访问的内存地址->引发段错误;
2.指向一个可用的,但是没有明确意义的空间,程序可以运行,但是实际上程序是有问题的,如果我们对野指针进行了解引用,对其所指向的内存地址作了非法修改,但是这块空间实际上在正在被使用,这个时候里面的正确内容就会被改变,导致程序奔溃,或数据损坏

四,如何规避野指针

1.定义创建一个指针变量时一定要记得初始化
2.动态开辟的内存空间,free()释放内存后,一定要马上将对应的指针置为NULL空指针
3.不用再函数中返回栈空间的指针(地址)或局部变量的地址
4.注意在动态开辟内存后,对其返回值做合理判断,判断其是否为空指针

五,面试题

找出下题的错误:

int* f2(void)
{
    int* ptr;
    *ptr=10;
    return ptr;
}

注意这个代码是错误,它没有把ptr初始化置为空指针,那么此时ptr是个野指针,不能对野指针进行解引用操作。

你可能感兴趣的:(C语言-基础,c语言)