千家信息网

C语言空类型中指针和空指针以及野指针的作用是什么

发表于:2024-12-13 作者:千家信息网编辑
千家信息网最后更新 2024年12月13日,C语言空类型中指针和空指针以及野指针的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。空类型指针-void*vo
千家信息网最后更新 2024年12月13日C语言空类型中指针和空指针以及野指针的作用是什么

C语言空类型中指针和空指针以及野指针的作用是什么,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

    空类型指针-void*

    void是空类型,void*是空类型指针,又叫万能指针,就是该指针能接收任意类型的指针,可以指向任何类型对象,所以不能对空类型指针进行解引用,必须强制类型转换成相应的指针类型,才能进行解引用操作。

    空指针类型:

    • 作为函数形参类型,可以接收任意类型的指针;

    • 作为函数返回值类型,在函数外面,将其强制类型转换为相应的指针类型

    • 可以与另一个void*类型指针比较大小

    注意:空类型指针不能进行解引用操作;不能进行±整数运算。

    空指针-NULL

    在C语言中,空指针NULL指的是地址为0的那块空间

    #define NULL((void*)0)

    对于这块空间是不准我们进行访问的,所以,对NULL是不能进行解引用操作的,所以每次对指针进行解引用操作之前,我们要判断是否为空指针。

    野指针

    野指针是指向一个非法的或已销毁的内存的指针。

    对野指针进行解引用操作是非法的。

    造成野指针的原因

    1.指针未初始化
    int main(){        char* p;        //此时p是野指针        return 0;}

    没有对指针p进行初始化,此时p就是野指针,如果此时对p进行解引用操作,非法访问内存,程序就会崩溃。

    2.指针越界访问
    int main(){        int arr[] = {1,2,3,4,5};        int* p = arr;        int i = 0;        for (i = 0; i < 10; i++)        {                printf("%d ",p[i]);        }        return 0;}

    虽然上面程序正常运行,但是其实越界访问了;只是仅仅访问了非法的内存空间,没有改变空间的值,程序有可能没来得及报错,但并不代表程序没有错,但是对于下面的代码,程序就会崩溃:

    int main(){        int arr[10] = {0};        int i = 0;        int* p = arr;        for (i = 0; i <= 10; i++)        {                *p = i;                p++;        }        return 0;}

    因为这里非法访问内存的同时试图改变空间的值,所以程序崩溃。

    3.指针指向的空间已经释放
    char* fun(){        char arr[] = "abc";        return arr;}int main(){        char* p = fun();        printf("%s\n",p);        return 0;}

    执行程序,给出如下警告


    虽然程序没有崩溃,但是这种写法是非法的,arr是局部变量,函数调用结束,栈帧销毁,局部变量空间归还给操作系统,我们没有使用权限,此时p就是野指针,*p属于非法访问内存。

    避免野指针

    1.指针要进行初始化

    指针要有初始值,初始化为NULL,或者有具体的指向。

    既然NULL也不能进行解引用操作,那么为什么可以将指针初始化为NULL?这里初始化为NULL,只是为了给指针一个指向,但是实际使用时,我们并不能对NULL进行解引用操作,所以使用指针之前才要有效性判断。

    2.使用指针之前要进行有效性判断

    使用指针之前,要判断是否为NULL,如果为NULL,那么是不能进行解引用操作的

    3.避免越界访问

    不要进行越界访问操作,即使还是访问不改变值也是非法的

    4.不要返回局部变量的地址

    局部变量空间在函数到调用结束,就归还给操作系统,如果返回局部变量的地址,函数外面接收该返回值的指针就变成了野指针

    5.当指针指向的空间释放后,要将该指针置为NULL

    这样避免对野指针解引用操作,同时避免二次释放动态开辟的内存空间

    int main(){        int* p = (int*)malloc(10*sizeof(int));                //1.判断有效性        if (p == NULL)        {                return -1;        }                //2.使用指针        int i = 0;        for (i = 0; i < 10; i++)        {                p[i] = i;        }                //3.释放指针指向的空间        free(p);        //free(p);//非法操作        //4.指针置为NULL        p = NULL;        free(p);//释放空指针什么都不做        return 0;}

    看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注行业资讯频道,感谢您对的支持。

    0