全网最接地气的C语言野指针介绍,此处对于野指针与空指针知识点做一些简要的介绍,作者实属初学,写博客也是作者学习的一个过程,难免文章中有内容理解不到位或者有不当之处,还请朋友们不吝指正,希望大家多多给予支持,赠人玫瑰,手有余香!

文章目录

  • 一:野指针
    • 1.1 :野指针的成因
    • 2.1 :规避野指针
  • 二:空指针

一:野指针

概念:野指针就是指向的内存地址是未知的(随机的,不正确的,没有明确限制的)。
说明:指针变量也是变量,是变量就可以任意赋值。但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)。
注:野指针不会直接引发错误,操作野指针指向的内存区域才会出问题。
代码示例:

int a = 100;
int *p;
p = a; //把a的值赋值给指针变量p,p为野指针, ok,不会有问题,但没有意义p = 0x12345678; //给指针变量p赋值,p为野指针, ok,不会有问题,但没有意义*p = 1000;  //对野指针进行赋值操作就不可以了

把a的值赋值给指针变量p,p为野指针, ok,不会有问题,但没有意义。
给指针变量p赋值,p为野指针, ok,不会有问题,但没有意义。

1.1 :野指针的成因

1. 指针未初始化:指针变量刚被创建时不会自动成为NULL指针,它的缺省值是随机的,它所指的空间是随机的。
代码示例:

int main()
{int * p;*p = 20;return 0;
}

(个人理解:指针变量有操作系统随机赋值,未指向一个具体空间,没有落脚点)
2. 指针越界访问:指针指向的范围超出了合理范围,或者调用函数时返回指向栈内存的指针或引用,因为栈内存在函数结束时会被释放。
代码示例:

int main()
{int arr[10] = {0};int *p = arr;for(int i = 0; i <= 11; i++){*(P++) = i;//当指针指向的范围超出数组arr的范围,p变成野指针。}return 0;
}

3 .指针释放后未置空:有时指针在free或delete后未赋值 NULL,便会使人以为是合法的。其实它们只是把指针所指的内存给释放掉,但并没有把指针本身忘记。此时指针指向的就是无效内存。释放后的指针应立即将指针置为NULL,防止产生“野指针”。
代码示例:

int main()
{int *p = NULL;p = malloc(10 * sizeof(int));if (!p){return;}//成功开辟内存,可以操作内存。free(p);p = NULL;return 0;
}

(个人理解:我们前一天住了个宾馆,第二天退房了,虽然我们知道一个该房间的门牌号,但是保洁阿姨已经收拾了房间,我们就不知道房间里具体是什么样的了,所以我们也没法操作了。)

2.1 :规避野指针

1. 初始化指针;
代码示例:

int main()
{int *p = NULL;int a = 10;p = &a;*p = 20;return 0;
}

2. 避免指针越界;
代码示例:

int main()
{int arr[10] = {0};int *p = arr;for(int i = 0; i < 10; i++){*(P++) = i;//严格遵守有效范围。}return 0;
}

3 避免返回局部变量的地址
代码示例:

int * test()
{int a = 20;return &a;
}
int main()
{int *p = NULL;p = test();printf("%d\n", *p);return 0;
}

这与变量的作用域有关,局部变量存在栈区,当被调函数结束后 ,栈区上局部变量的内存空间被释放,若再去访问该空间就不合理了。
4. 开辟的指针释放后置为NULL
当指针p指向的内存空间释放时,没有设置指针p的值为NULL。free只是把内存空间释放了,但是并没有将指针p的值赋为NULL。
代码示例:

int main()
{int *p = NULL;p = malloc(10 * sizeof(int));if (!p){return;}//成功开辟内存,可以操作内存。free(p);p = NULL;//避免野指针return 0;
}

5. 养成良好的编程习惯
好的编程习惯可以避免很多问题,道阻且长,但行则将至!!!

二:空指针

*NULL是一个值为0的宏常量:#define NULL ((void )0)

意义:为了标志指针变量没有指向任何变量(空闲可用),在C语言中,通常把NULL赋值给此指针,这样就标志此指针为空指针,没有指向任何空间。

注意:对指针解引用操作可以获得它所指向的值。但从定义上看,NULL指针并未指向任何东西,因为对一个NULL指针解引用是一个非法的操作,所以在解引用之前,必须确保它不是一个NULL指针。
代码示例:

void test(){char *p = NULL;**//给p指向的内存区域拷贝内容**strcpy(p, "1111"); //errchar *q = 0x1122;//给q指向的内存区域拷贝内容strcpy(q, "2222"); //err
}

OK!!!观众老爷们,这里只是介绍了野指针与空指针,如果朋友们觉得有一点点作用的话,希望朋友们能够给予小菜鸟一点支持!后续继续给朋友们带来更好的博文,还希望朋友们能够继续关注,小菜鸟致力于把自己的学习经验与个人理解更多的分享给大家,望大家喜欢与指正。

【C语言基础】野指针与空指针相关推荐

  1. linux野指针追踪,【华清远见】野指针和空指针的两个小点

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 作者:吕老师,华清远见嵌入式学院讲师. 大家都知道指针的学习对于c语言学习来说可谓是至关重要的,下面我们来说一下在指针中两种比较特殊的关于指针的概念,野指 ...

  2. c语言指针地址交换程序,C语言-基础教程-指针的地址分配

    我们可以定义指针变量指向任何类型的变量.在上述的处理过程中,指针变量指向的变量通过传递变量的地址来实现.指针变量的取值是内存的地址,这个地址应当是安全的,不可以是随意的,否则,写入内存单元的值将会使得 ...

  3. c语言野指针应用,C语言中野指针的深入解析

    C语言中野指针的深入解析 C语言中野指针这一块是C语言的难点,下面小编为大家带来了C语言中野指针的深入解析,欢迎大家阅读! "野指针"的成因主要有两种: (1)指针变量没有被初始化 ...

  4. C++中野指针和空指针和无类型指针

    C++中野指针和空指针和无类型指针https://blog.csdn.net/chenguolinblog/article/details/27054267 一. 野指针 所谓的野指针指的是一个指针变 ...

  5. C/C++总结笔记——指针1:野指针、空指针(NULL和nullptr)、悬空指针、智能指针

    C/C++中有几种指针相关的概念,只知道有这样的概念,但HR一问就露馅,这里进行总结方便复习. 1.野指针 1.指针定义时未被初始化:指针在被定义的时候,如果程序不对其进行初始化的话,它会指向随机区域 ...

  6. c语言野指针和空指针,C++中的空指针和野指针

    空指针常量 一个表示0值的整数常量,叫做空指针常量.例如:0.0L.1-1(它们都是值为0的整数常量表达式)以及(void*)0.void* NULL 都是空指针常量,空指针常量可以赋值给任何指针类型 ...

  7. 指针 是否相同_c专题之指针---野指针和空指针解析

    ----在上一篇c专题指针文章中,我们介绍了什么是指针,文章里面从普通变量进而引出指针的概念,这样对指针的理解有一定的帮助(其实最好的理解,就是要明白硬件里面的内存原理,这是理解指针最好的地方,就好比 ...

  8. C++野指针和空指针

    空指针常量 一个表示0值的整数常量,叫做空指针常量.例如:0.0L.1-1(它们都是值为0的整数常量表达式)以及(void*)0.void* NULL 都是空指针常量,空指针常量可以赋值给任何指针类型 ...

  9. C语言基础专题 - 指针(编写中)

    C语言基础专题 - C的灵魂没了篇 本文介绍了C语言中指针及其用法 - 由于博主水平有限,疏忽在所难免.若发现错误请告知博主更正,十分感谢. - 邮箱:291148484@163.com - 希望博文 ...

最新文章

  1. VC++ 串行化编程实例
  2. 通过IP地址查计算机名
  3. 分布式存储MooseFS的搭建
  4. 三星全速进军物联网 所有产品都将内置互联功能
  5. 电脑用电量_闲置电脑也能赚钱?「BOINC算力地球」借区块链技术扩大共享算力...
  6. C语言基础知识----注意事项
  7. 某计算机有900条指令,计算机组成原理习题集.doc
  8. Python制作一个简单的图片文字提取+PDF转WORD的软件
  9. SSL安全证书不受信任怎么办
  10. 电池单位中的毫安时与能量单位千焦及大卡的换算关系
  11. fms安装教程 linux_如何借助Pandora FMS监控CentOS和Ubuntu服务器?
  12. 函数计算机使用说明,SHARP-EL506P 函数计算器的使用说明
  13. sso单点登录与Jsonp
  14. Value cannot be null. (Parameter ‘connectionString‘)
  15. smartsvn的常见问题
  16. pairs和ipairs的区别
  17. R语言ggplot2可视化:使用patchwork包的plot_layout函数将多个可视化图像组合起来,ncol参数指定行的个数、byrow参数指定按照行顺序排布图
  18. 新品PDF黄钻换器在线
  19. 单片机开发从来不用数据结构?
  20. 2021浙大计算机学硕,2021浙江考研:浙江大学计算机878考试大纲公布

热门文章

  1. 均值、方差、协方差、协方差矩阵
  2. 怎么制作个人微信公众号
  3. [附源码]Python计算机毕业设计SSM基于Java的健身房管理系统(程序+LW)
  4. 03 | 数组与链表:存储设计的基石有哪些?
  5. lrange是取出所有值并移除么_TCL中的列表修改命令lrange、linsert、lreplace、lset和 lappend | 坐倚北风...
  6. 利物浦战胜西汉姆获得足总杯冠军
  7. 基于pycharm的keras学习日志
  8. Java大数据学习第六天------面向对象 类 对象 封装
  9. 扫地机器人 单线 雷达_在我们的雷达上:6月比赛,标题,桌子和机器人
  10. 漳州职业技术学院工业机器人技术_漳州职业技术学院工业机器人技术专业师生到我司参观交流...