• 【C语言】空指针&野指针学习小结


    0x00 前言

    系统版本:Ubuntu 14.04_64

    编译工具:gcc (version 4.8.4)

    最后更新:2022-08-05

    0x01 空指针&野指针小结

    1.空指针

    概念:特殊的指针变量,表示不指向任何内容
    作用:在指针变量创建的时候,可以初始化NULL
    注意:不能对空指针进行解引用(取指针指向的地址的内容)等操作

    例1:

    #include
    int main(){
    
    	char *p = NULL;
    	strcpy(p, "abcd"); //错误,对空指针指向的内存空间进行拷贝操作
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    例2:

    #include
    
    int main(){
    
    	char *p = NULL;
    	printf("%02x\n", *p);//错误,对空指针进行解引用操作
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    例3:

    #include
    
    int main(){
    
    	char *p = NULL;
    	printf("%02x\n", p);	//正确,输出的NULL地址,一般为0
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.野指针

    概念:野指针指向一个已经释放的内存或者未申请过的内存空间
    注意:不要对野指针进行解引用操作

    例4:

    #include
    
    int main(){
    
    	char *p = 0x1234;
    	strcpy(p, "abcd");//错误,虽热不是空指针,但是没有申请过内存空间
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    1)常见野指针

    1.指针变量未初始化
    2.释放堆区的指针后没有置空(造成误用)
    3.指针操作超越了变量作用域
    例5:

    #include
    
    int* func()
    {
    	int a = 10;
    	int * p = &a;
    	return p;
    } 
    void test()
    {
    	//1 指针变量未初始化
    	int * p1;
    	printf("%d\n", *p1); //gcc下可以运行,vs下报错
    	
    	//2 指针释放后未置空
    	int * p2 = (int*)malloc(sizeof(int));
    	*p2 = 100;
    	printf("%d\n", *p2);
    	free(p2);
    	printf("%d\n", *p2); //不报错,但打印乱码,可能造成误用
    	p2 = NULL;
    	printf("%d\n", *p2); //置空后报错,防止误用
    	
    	//3 指针操作超越变量作用域
    	int * p3 = func();
    	printf("%d\n", *p3);	//系统保留一次局部变量地址func中的p
    	printf("%d\n", *p3);	//系统释局部变量地址func中的p,打印乱码
    }
    
    int main(){
    	
    	test();
    	
    	return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    另外,空指针可以free释放,野指针不能释放。

    以上。
    参考资料:
    1.https://www.bilibili.com/video/BV18y4y1H7pt?p=15&spm_id_from=pageDriver&vd_source=400083cd545d1a00e016c8759f136df3

  • 相关阅读:
    解决WordPress更新插件或者更新版本报WordPress 需要访问您网页服务器的权限的问题
    leetcode每天5题-Day23
    如何在外网访问内网服务器数据库
    离线部署 python 3.x 版本
    Nerfies:可变形神经辐射场
    第十八天笔记
    三层vlan实验
    忘忧大陆-功能完备的社交项目整体介绍
    C现代方法(第18章)笔记——声明
    Ubuntu20.04 搭建L2TP+IPsec客户端
  • 原文地址:https://blog.csdn.net/wangqingchuan92/article/details/126174077