什么是野指针 如何避免野指针

本文探讨了野指针的概念及其可能导致的内存泄漏问题。解释了野指针是如何导致程序失去对内存的控制,并提出了避免野指针的有效方法。

谈谈你对野指针的理解?

 

野指针不是NULL指针,是指向“垃圾”内存的指针。即它是随机指向的,系统自动对其初始化。

 

野指针会造成什么样的后果呢?

最大的问题:它会导致内存泄漏。

 

什么叫作内存泄漏?

指由于疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并非指内存在物理上的消失,而是程序分配某段内存后,由于设计错误,失去了对该段内存的控制,因而造成了内存的浪费。

简单的说,内存泄漏分为两方面:1、非法访问空间 2、访问了已经释放的空间。

 

面试题:如何避免野指针?

我觉得可以注意以下几个方面:

1.首先我们要养成良好的编码习惯。

2.当我们定义一个指针的时候,直接让它指向NULL。因为NULL在宏定义是#define NULL (void *) 0  它代表的是零地址,而零地址是不能进行读写操作的。

3.要想给指针指向的空间赋初值的时候,必须给指针分配空间。

可是使用malloc()进行分配空间,它返回的是空间的首地址。

4.在分配空间后,我们首要做的是检查是否分配成功。

简单的检测方法:

if (p == NULL)     //p为指针变量

{

printf(“malloc分配失败!”);

eixt(1);      //结束整个程序,return 是结束一个函数

}

5.在使用malloc分配后的空间之前一定要对其清零。

因为我们分配的空间里面可能残留一些垃圾数据,这样会导致程序出错。

6.使用完空间后,记得释放空间,可以用free(p);//p为指针变量

7.释放完后可以让指针指向NULL,如:p = 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; } ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值