码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【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

  • 相关阅读:
    基于节点分层的配网潮流前推回代方法matlab程序(IEEE33节点潮流计算)
    石子合并终极版 (GarsiaWachs算法) [o(n*n)] 板子
    机器学习泛化误差
    mpu6050移植DMP库
    uView Calendar 日历
    网站优化的技能有哪些内容?
    记一次 .NET某管理局检测系统 内存暴涨分析
    (11)点云数据处理学习——Colored point cloud registration(彩色点注册)
    【Nano Framework ESP32篇】使用 LCD 屏幕
    (三)使用 Vue 脚手架
  • 原文地址:https://blog.csdn.net/wangqingchuan92/article/details/126174077
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号