什么是野指针?野指针的危害?如何避免野指针?

本文详细解释了野指针的概念及其可能带来的危害,并提供了避免野指针出现的有效措施。

什么是野指针?

野指针是指随机指向一块内存的指针

野指针的危害?

野指针可能会造成内存泄露的危害。(注意:野指针不会一定造成内存泄露,如果该野指针指向的内存刚好是某个变量的地址,那么野指针也能使用这块内存)

如何避免野指针?

我们要在以后养成良好的编码习惯:

1.将没有指向的指针初始化指向NULL(指向NULL的指针不能对他的指向进行修改)

2.当想给一个指针指向的空间赋值时,一定要给这个指针分配空间(malloc)

3.当空间分配完后,要检查这个指针的空间是否分配成功

4.当空间分配完后,要先将这块内存初始化(memset,bzeor)

5.当这块内存使用完后,必须将这块内存释放(free)

6.释放完空间后,将指针再次指向NULL(防止这个指针再次成为野指针)

指针(**Wild Pointer**)是指**指向“不可用”或“无效”内存地址的指针**。它并不指向任何合法的对象或函数,访问或操作指针会导致**未定义行为(Undefined Behavior)**,比如程序崩溃、数据损坏或不可预测的结果。 --- ### 一、指针产生的常见原因 #### 1. **未初始化的指针** ```c int *p; *p = 10; // p 是指针,未初始化就使用,行为未定义 ``` #### 2. **释放后未置空的指针** ```c int *p = malloc(sizeof(int)); free(p); *p = 20; // p 是指针,指向已释放的内存 ``` #### 3. **指向局部变量的指针** ```c int *getPointer() { int a = 20; return &a; // 返回局部变量地址,函数结束后 a 被销毁,返回的是指针 } ``` --- ### 二、如何避免指针? #### ✅ 1. **初始化指针为 NULL** ```c int *p = NULL; // 初始化为空指针 ``` > 空指针可以安全地进行判断,不会造成未定义行为。 #### ✅ 2. **动态分配内存后检查是否成功** ```c int *p = malloc(sizeof(int)); if (p == NULL) { // 内存分配失败处理 } ``` #### ✅ 3. **释放指针后将其置为 NULL** ```c free(p); p = NULL; // 避免指针 ``` 这样即使后续误用 `p`,也能通过判断 `p == NULL` 来避免崩溃。 #### ✅ 4. **不要返回局部变量的地址** ```c int *getPointer() { int a = 20; int *p = &a; return p; // ❌ 错误:返回局部变量的地址 } ``` 应改为: ```c int *getPointer() { int *p = malloc(sizeof(int)); if (p != NULL) { *p = 20; } return p; // ✅ 正确:返回堆内存地址 } ``` #### ✅ 5. **使用前检查指针是否为空** ```c if (p != NULL) { *p = 100; } ``` --- ### 三、指针危害 | 情况 | 后果 | |------|------| | 读取指针 | 可能读取到不可预测的数据 | | 写入指针 | 可能覆盖其他数据,造成程序崩溃或安全漏洞 | | 多次释放指针 | 导致 double-free 错误,严重崩溃 | --- ### 四、示例代码:指针 vs 安全指针 #### ❌ 指针示例: ```c #include <stdio.h> #include <stdlib.h> int main() { int *p; *p = 10; // p 未初始化,是指针 printf("%d\n", *p); return 0; } ``` #### ✅ 安全写法: ```c #include <stdio.h> #include <stdlib.h> int main() { int *p = NULL; p = malloc(sizeof(int)); if (p != NULL) { *p = 10; printf("%d\n", *p); free(p); p = NULL; } return 0; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值