野指针

本文探讨了野指针的概念及其可能引发的问题,包括内存泄漏和段错误等。提出了通过良好的编程习惯来避免野指针的六种方法,如指针初始化、内存分配检查、内存释放等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

野指针造成的错误叫做”内存泄漏”。使用野指针会因内存泄漏而产生段错误。

但野指针造成的程序错误不一定每次都会产生段错误,因为内存随机分配的地址可能是已经分配使用过的地址。

产生内存泄漏的原因偶遇两个;1、访问了没有权限的内存。我们平时正确使用指针时,系统会将相应的内存分配给用户,但是如果指向没有分配内存,系统会判定我们没有权限。

2、访问了已经释放的内存。

野指针是无法杜绝的,只可以被避免。避免野指针,最有效的方法即是养成良好的编程习惯。我认为有以下几点:

1、当一个指针没有指向时,我们要将指针指向设置为NULL。因为操作系统规定0地址是不允许进行任何操作的。

语句为#define NULL(void*)

          int *p = NULL;

置为空的目的是为了提醒我们不再对该指针指向空间进行操作,并且该指针是一个野指针。

2、当给一指针赋值时要检查是否分配了内存。我们要用堆空间里的malloc函数进行内存分配。

语句为:int *p = malloc(sizeof(int));

3、当给一个指针分配玩空间,我们要检查一下malloc函数是否调用成功,空间是否分配成功。

语句:if(p==NULL)

{

     printf("malloc error!\n");

    exit(1);

}

4、没分配好一个内存,我们要初始化一下。即清空内存中的数据。

语句:menset (p,0,sizeof(int));

5、使用完指针要进行内存的释放。

语句:free(p);

6、释放完内存,要将指针再次置为空。

语句:p=NULL;


内容概要:文章详细介绍了电梯门禁(梯控)系统的硬件安装与接线要点。首先强调了梯控板与楼层按键对接的重要性,包括遵循一一对应原则以避免错层、越层问题,允许空层存在以适应实际需求。接着阐述了不同接线方式(COM、NO、NC端口的不同组合)对用户权限的影响,如单层权限用户刷卡直达指定楼层,多层权限用户在特定接线方式下的操作限制。硬件安装方面,强调了无源干触点设计原则以确保电气隔离,防止系统间干扰,以及读卡器接入时的规范要求。文章还介绍了梯控系统的技术原理,如身份验证机制(二维码/IC卡/人脸识别)、消防联动功能(紧急情况下释放所有楼层权限),并指出该系统适用于小区、写字楼等场景,支持机器人乘梯SDK扩展。最后,根据不同场景需求提出了适用的接线方式选择,如严格管控场景下选择4.3接线以实现精准权限控制,限制多层用户手动选层场景下选择4.1接线并配合软件权限设置。; 适合人群:从事电梯安装维护的技术人员、楼宇自动化工程师及相关领域的管理人员。; 使用场景及目标:①指导技术人员正确安装和接线梯控系统,确保系统安全稳定运行;②帮助管理人员了解不同接线方式对用户权限的影响,以便根据实际需求选择合适的配置方案;③提升楼宇安全管理和服务质量,特别是在小区、写字楼等场所的应用。; 其他说明:梯控系统的正确安装和接线不仅关系到系统的正常运作,更直接影响到用户的安全和使用体验。因此,在实际操作中务必严格按照规范执行,同时关注最新的技术发展和应用场景变化,以确保系统始终处于最佳状态。
### 指针的定义 在 C 语言中,指针是指向未知或非法内存区域的指针。这种指针通常没有被正确初始化或者已经失去了对其原本指向的有效内存的控制[^1]。 ```c int *p; // 声明了一个未初始化的指针,此时 p 是一个指针 ``` --- ### 指针形成的常见原因 #### 1. **未初始化的指针** 如果声明了一个指针变量但没有对其进行初始化,则该指针会持有随机值,这使得它成为指针[^2]。 ```c int *q; printf("%d\n", *q); // q 没有初始化,解引用会导致未定义行为 ``` #### 2. **释放后未置空的指针** 当通过 `free()` 或者结束作用域的方式释放了动态分配的内存后,如果没有将指针置为 `NULL`,则该指针仍然保留着原来的地址值,但它现在指向的是已经被释放的内存区域,这就形成了指针[^3]。 ```c int *r = (int *)malloc(sizeof(int)); *r = 10; free(r); printf("%d\n", *r); // r 成为了指针,解引用会产生未定义行为 ``` #### 3. **函数返回局部变量的地址** 在一个函数内部创建的局部变量,在函数退出时会被销毁。如果在此期间将该局部变量的地址作为返回值传递给外部调用方,则这个返回值实际上是一个指向无效存储位置的指针[^4]。 ```c int* getLocalAddress() { int x = 10; return &x; // 返回局部变量的地址,形成指针 } void testWildPointer() { int *y = getLocalAddress(); printf("%d\n", *y); // y 是指针,解引用会有问题 } ``` #### 4. **数组越界访问** 对于指针来说,一旦进行了非法的操作(如超出范围),也可能间接导致指针的现象发生[^5]。 ```c int array[5]; int *z = array + 6; // z 越过了合法边界,属于指针范畴 printf("%d\n", *z); // 不可预测的结果 ``` --- ### 解决指针的方法 为了避免指针带来的隐患,可以采用以下几种策略: #### 方法一:始终初始化指针 无论何时都应确保每一个新声明出来的指针都被赋予合适的初值,最常用的做法就是将其设定为 `NULL`。 ```c int *safe_p = NULL; // 显式初始化为 NULL ``` #### 方法二:释放资源后及时清零 每次完成对动态分配空间的操作之后,应当马上把相应的指针重新设置回 `NULL` 状态,这样即使以后不小心再次使用到也不会引发严重的后果。 ```c if (ptr != NULL) { free(ptr); ptr = NULL; // 将已释放的指针置为 NULL } ``` #### 方法三:避免返回局部变量地址 不要让任何函数暴露自己的临时对象所在的位置信息出去,改用静态变量或者其他形式实现功能需求。 ```c static int static_x = 20; int* getStaticAddress() { return &static_x; // 返回静态变量的地址,安全可靠 } ``` #### 方法四:严格检查指针有效性 在实际编程过程中养成良好的习惯,即每一步涉及指针之前都要先验证它的合法性再继续执行下一步逻辑判断。 ```c if (some_pointer && some_condition) { /* Safe to dereference */ } else { /* Handle error or invalid pointer case */ } ``` 综上所述,通过对上述各种情况的认识以及采取有效的防护手段,可以在很大程度上减少乃至杜绝指针所带来的麻烦和危害。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值