空指针与野指针

一、什么是空指针
指针变量的值等于NULL(#define NULL ((void *)0))的指针叫做空指针
注意:空指针不能解引用,因为此地址存储的是系统复位时要使用数据,不能访问,一旦解引用就会出现段错误

二、如何避免使用空指针
对来历不明的指针前要先判断是否是空指针,if(NULL == p)
注意:NULL不一定是0,也有可能是1

三、什么是野指针
指向的内存不明确的指针叫野指针
注意:使用野指针不一定出错,但它比空指针更危险,因为野指针是无法被判断出来的,因此只有不制造野指针才能避免使用野指针

四、如何避免野指针
1、定义指针时一定要初始化
2、内存释放后指针要及时置空
3、不要指向随时可能被释放的目标
4、指针操作不要超越变量的作用范围,比如不要返回局部变量的地址
注意:free与delete只是把指针所指向的内存释放掉,但并没有把指针本身清理掉,这时候指针依然指向原来的位置,只不过这个位置的数据已经被清理了,此时指针指向的内存就是一个垃圾内存,但此时的指针的值并不是NULL

### 空指针指针的区别及用法 #### 定义上的差异 空指针是一种特殊的指针值,用于表示该指针不指向任何有效的对象或函数。它由宏 `NULL` 表示,并且在大多数情况下会被定义为 `(void*)0` 或简单的整数值 `0` [^1]。这意味着空指针有一个明确的值,即零值地址,这使得它可以安全地参条件判断语句中而不引发未定义行为。 另一方面,指针是指那些未经初始化或者曾经指向一块有效内存但在释放之后没有置为空(或其他合理值)的指针 [^3]。由于这些指针持有不确定的状态,它们可能导致程序崩溃或者其他难以追踪的错误,因为试图访问这样的指针对应的数据区域通常是非法的。 #### 初始化阶段的不同 当创建一个新的指针变量时,默认情况下它的初始值可能是任意垃圾数据除非显式设置成某个具体的目标地址或者是专门保留给“无关联”的标志—也就是所谓的‘null’状态: ```c int *wildPtr; // Wild pointer due to lack of initialization. if(wildPtr != NULL){} // Undefined behavior until properly initialized. int *safePtr = NULL; // Safe because explicitly set as null-pointer. ``` 在这里可以看到第一个例子中的 `wildPtr` 就是一个典型意义上的指针因为它刚被声明出来却没有得到合理的初值设定;相反第二个实例里的 `safePtr` 则是从一开始就处于可控范围之内——我们知道此时此刻它并不指向任何一个实际存在的资源所以不会轻易造成意外后果。 #### 使用场景对比分析 - **空指针的应用** - 函数参数默认值:某些API设计允许调用方省略部分可选输入项这时可以用到空指针代替缺失的信息。 ```c void logMessage(const char *msg, FILE *outputStream){ if(outputStream==NULL) outputStream=stdout; fprintf(outputStream,"%s\n", msg); } logMessage("Test Message", NULL); // Outputs message on standard output stream. ``` - 错误指示器:像之前提到过的动态内存分配失败情形下常用作反馈机制告知请求未能成功完成。 - **指针的风险规避措施** - 总是在使用前确认所有指针均已适当配置好目标; - 对不再使用的堆区及时清理并将相应引用重设回空态以防后续误触残留记录; - 启动静态代码质量检测工具辅助发现潜在隐患点等等方法都可以有效地减少因不当运用而导致的问题发生几率。 --- ### 结束语 总结来说,虽然两者都是围绕着指针这一核心概念展开讨论的对象,但是它们之间存在着本质区别以及各自适用的最佳实践领域。正确理解区分这两类指针有助于编写更加健壮可靠的软件解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值