指针的认识(野指针、规避野指针、assert宏断言)

目录

a.野指针成因

1.指针未初始化

2.指针越界访问

3.指针指向的空间释放

b.规避野指针

1.指针初始化

2.小心指针越界

3.指针变量不再使用时,及时置NULL,指针使用之前检查有效性

4.避免返回局部变量的地址

c.assert宏断言的使用


        概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。一句话,任何指向非自己管理或者不想指向空间的指针都是野指针。

a.野指针成因

1.指针未初始化

#include <stdio.h>
int main()
{int* p;//局部变量指针未初始化,默认为随机值*p = 20;return 0;
}

上述代码中,没有为 p 指针初始化,无法确定 p 所指向的空间是否合法,直接解应用赋值,错误。

2.指针越界访问
#include <stdio.h>
int main()
{int arr[10] = { 0 };int* p = &arr[0];int i = 0;for (i = 0; i <= 11; i++){//当指针指向的范围超出数组arr的范围时,p就是野指针*(p++) = i;}return 0;
}

上述代码中,数组 arr 有效元素个数只有10个,但指针 p 却访问到了第11个空间,此空间不是合法空间,错误。

3.指针指向的空间释放
#include <stdio.h>int* test()
{int n = 100;return &n;
}int main()
{int* p = test();printf("%d\n", *p);return 0;}

上述代码中,n 变量作为test()函数的局部变量,当test()函数调用结束,函数栈帧销毁后,n 变量空间被销毁系统回收),此时 p 即为指向非法空间的指针,错误。

b.规避野指针

1.指针初始化

        如果明确知道指针指向哪里就直接赋值地址,如果不知道指针应该指向哪⾥,可以给指针赋值NULL。NULL 是C语言中定义的一个标识符常量,值是0,0 也是地址,这个地址是无法使用的,读写该地址会报错。

  NULL的 C 定义:

#include <stdio.h>
int main()
{int num = 10;int* p1 = &num;int* p2 = NULL;return 0;
}

p1 用于指向 num 变量明确,所以 p1 初始化直接赋值 num 变量地址,p2 也许后期使用但现在不知道该指向那个空间,于是给其初始化赋值NULL。

2.小心指针越界

        一个程序向内存申请了哪些空间,通过指针也就只能访问哪些空间,不能超出范围访问,超出了就是越界访问。

        比如访问数组时,数组长度用sizeof(arr)/ szieof(type)来丈量,使用动态内存开辟时,使用变量数值来代替常量或者使用宏定义

3.指针变量不再使用时,及时置NULL,指针使用之前检查有效性
int main()
{int arr[10] = { 1,2,3,4,5,67,7,8,9,10 };int* p = &arr[0];for (i = 0; i < 10; i++){*(p++) = i;}//此时p已经越界了,可以把p置为NULLp = NULL;//下次使⽤的时候,判断p不为NULL的时候再使⽤//...p = &arr[0];//重新让p获得地址if (p != NULL) //判断{//...}return 0;
}
4.避免返回局部变量的地址

c.assert宏断言的使用

       我们可以把野指针想象成野狗,野狗放任不管是非常危险的,所以我们可以找⼀棵树把野狗拴起来,就相对安全了,给指针变量及时赋值为NULL,其实就类似把野狗栓起来,就是把野指针暂时管理起来。不过野狗即使拴起来我们也要绕着走,不能去挑逗野狗,有点危险;对于指针也是,在使用之前,我们也要判断是否为NULL,看看是不是被拴起来起来的野狗,如果是,不能直接使用,如果不是,我们再去使用。

        assert.h 头件定义了宏 assert() ,用于在运行时确保程序符合指定条件,如果不符合,就报
错终止运行。这个宏常常被称为“断言”。

        上面代码在程序运行到这一行语句时,验证变量 p 是否等于 NULL 。如果确实不等于 NULL ,程序继续运行,否则就会终止运行,并且给出报错信息提示。
        assert() 宏接受⼀个表达式作为参数。如果该表达式为真(返回值非零), assert() 不会产生
任何作用,程序继续运行。如果该表达式为假(返回值为零), assert() 就会报错,
在标准错误
流 stderr 中写入一条错误信息,显示没有通过的表达式,以及包含这个表达式的文件名和行号。
        assert() 的使用对程序员是非常友好的,使用 assert() 有几个好处:它不仅能自动标识文件和出问题的行号,还有⼀种无需更改代码就能开启或关闭 assert() 的机制。如果已经确认程序没有问题,不需要再做断言,就在 #include <assert.h> 语句的前面,定义一个宏 NDEBUG 。

        assert() 的缺点是,因为引人了额外的检查,增加了程序的运行时间。一般我们可以在 Debug 中使用,在 Release 版本中选择禁用 assert 就行,在 VS 这样的集成开发环境中,在 Release 版本中,直接就是优化掉了。这样在debug版本写有利于程序员排查问题,在 Release 版本不影响用户使用时程序的效率。

        assert宏更详尽的信息:assert - C++ Reference (cplusplus.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/22145.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

容器化部署Pig微服务快速开发框架

系统说明 基于 Spring Cloud 、Spring Boot、 OAuth2 的 RBAC 企业快速开发平台&#xff0c; 同时支持微服务架构和单体架构 提供对 Spring Authorization Server 生产级实践&#xff0c;支持多种安全授权模式 提供对常见容器化方案支持 Kubernetes、Rancher2 、Kubesphere、E…

适合小白学习的项目1901java体育馆管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java体育馆管理系统 是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助采用了java设计&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统采用web模式&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&am…

【STL深入浅出】之string类的简单模拟实现

&#x1f4c3;博客主页&#xff1a; 小镇敲码人 &#x1f49a;代码仓库&#xff0c;欢迎访问 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f30f; 任尔江湖满血骨&#xff0c;我自踏雪寻梅香。 万千浮云遮碧…

13-为什么在JavaScript中0.1 + 0.2不等于0.3?

为什么在JavaScript中0.1 0.2不等于0.3&#xff1f; 笔记分享 在编写JavaScript代码时&#xff0c;你可能会遇到一个奇怪的现象&#xff1a;0.1 0.2并不等于0.3。这个问题并不仅仅局限于JavaScript&#xff0c;它在许多编程语言中都会出现。本文将解释背后的原因&#xff0c…

“慢公司”小红书,加速布局大模型

自成立至今&#xff0c;小红书一直保持低调并被形容为“慢公司”&#xff0c;而这也反映在大模型相关产品线上。尽管上线了多项功能和应用&#xff0c;存在感却稍显不足。 进入2024年&#xff0c;小红书在大模型领域的探索悄然加速&#xff0c;持续引发市场关注度。 多方消息…

BIOS主板(非UEFI)安装fedora40的方法

BIOS主板(非UEFI)安装fedora40的方法 现实困难&#xff1a;将Fedora-Workstation-Live-x86_64-40-1.14.iso写入U盘制作成可启动U盘启动fedora40&#xff0c;按照向导将fedora40安装到真机的sda7分区中得到报错如下内容&#xff1a; Failed to find a suitable stage1 device: E…

socket.gaierror: [Errno 11001] getaddrinfo failed

socket.gaierror: [Errno 11001] getaddrinfo failed 错误通常表示在解析主机名或 IP 地址时出现问题。这可能是因为提供的 IP 地址或主机名无效&#xff0c;或者存在 DNS 解析问题。 打印日志发现config.ini中的host不能加引号

Javaweb基础之json

大家好&#xff0c;这里是教授.F 目录 引入&#xff1a; 定义格式&#xff1a; json规制&#xff1a; 字符串转json&#xff1a; json转字符串: 字符串和json转化细节&#xff1a; json在java中的使用: 应用实例&#xff1a; JavaBean和json字符串的转换&#xff1a; l…

ZL-GL-4离体组织灌流系统测试在恒温条件下离体标本的肌张拉力

简单介绍&#xff1a; 离体组织灌流系统为生理实验及药理实验提供恒温环境&#xff0c;在麦氏浴皿内加养液同时能通氧&#xff0c;测试在恒温条件下离体标本的肌张拉力&#xff0c;离体组织灌流系统具有进气口,配备微调固定器,省时省力,并提高了实验效率,同时可方便串联恒温供水…

django ORM model update常规用法

Django ORM(对象关系映射)提供了一种强大而直观的方式,通过Python类和方法与数据库交互。在Django模型中更新记录是一个常见的任务,可以通过多种方式完成。以下是一些常见的更新记录的方法: 1. 更新单条记录 使用 save() 方法 最直接的方法是先获取记录,修改其属性,然…

prometheus+alertmanager+webhook钉钉机器人告警

版本&#xff1a;centos7.9 python3.9.5 alertmanager0.25.0 prometheus2.46.0 安装alertmanager prometheus 配置webhook # 解压&#xff1a; tar -xvf alertmanager-0.25.0.linux-amd64.tar.gz tar -xvf prometheus-2.46.0.linux-amd64.tar.gz mv alertmanager-0.25.0.linu…

C/S模型测试及优化

1 1.1代码示例 #include<stdio.h> #include<stdio.h>#include <sys/types.h> /* See NOTES */ #include <sys/socket.h>#include <netinet/in.h> #include <netinet/ip.h> /* superset of previous */ #include <arpa/inet.…

NoSQL数据库:定义、特性、分类与应用场景的探索

目录 一、引言 二、NoSQL的定义与起源 三、NoSQL的特性 四、NoSQL的分类 五、NoSQL的应用场景 六、NoSQL数据库在物联网&#xff08;IoT&#xff09;应用中的优势 最近在做关于NoSQL的市场调研&#xff0c;于是浅写下调研的总结&#xff0c;给大家分享&#xff0c;当做科…

计算机基础知识

计算机基础知识 计算机是如何工作的 在本节内容中,介绍了计算机核心工作机制,计算机结构,框架等,计算机需求在人类的历史中是广泛存在的,发展大体经历了从一般计算工具到机械计算机到目前的电子计算的发展过程 文章目录 计算机基础知识一、冯诺依曼体系结构二、CPUCPU的核心参…

接口测试JSON/XML请求

目录&#xff1a; JSON请求XML请求 JSON简介&#xff1a; 是JavaScript Object Notation的缩写是一种轻量级的数据交换格式是理想的接口数据交换语言 JSON请求&#xff1a; 构造JSON请求体JSON字符串HashMap对象Jackson库 构造JSON请求体&#xff1a; package com.ceshi…

STM 32_HAL_SDIO_SD卡

STM32的SDIO&#xff08;Secure Digital Input Output&#xff09; 接口是一种用于SD卡和MMC卡的高速数据传输接口。它允许STM32微控制器与多种存储卡和外设进行通信&#xff0c;支持多媒体卡&#xff08;MMC卡&#xff09;、SD存储卡、SDI/O卡和CE-ATA设备。STM32的SDIO控制器…

JAVA-学习

一、垃圾回收机制 1、为什么要进行垃圾回收机制 如果不进行垃圾回收&#xff0c;内存迟早都会被消耗空&#xff0c;因为我们在不断的分配内存空间而不进行回收。除非内存无限大&#xff0c;我们可以任性的分配而不回收&#xff0c;但是事实并非如此。所以&#xff0c;垃圾回收…

【大模型】在大语言模型的架构中,Transformer有何作用?

Transformer在大语言模型架构中的作用 Transformer是一种用于序列到序列&#xff08;Seq2Seq&#xff09;任务的深度学习模型&#xff0c;由Vaswani等人于2017年提出。在大语言模型&#xff08;LLM&#xff09;的架构中&#xff0c;Transformer扮演着关键的角色&#xff0c;它…

全面解析LG webOS:从开发到智能电视的演进

本文全面探讨了LG webOS的发展历程、技术特点、开发资源以及与Android TV的对比。涵盖了webOS的历史背景、功能特性、开发工具、用户体验以及市场表现&#xff0c;旨在为读者提供一个深入了解webOS的全面视角。 文章目录 webOS的历史与发展从Palm到LG的收购历程关键版本的发布日…

前端性能优化总结笔记

资源加载优化 DNS预解析 简单介绍: DNS 的作用是将域名解析为 IP 地址&#xff0c;解析的过程是耗时的&#xff0c;转化后会做本地缓存&#xff0c;我们的优化的目标主要是针对用户第一次访问站点的时候陷入长时间白屏的问题。 DNS 解析可以分为两类: 第一类是页面 DNS 解…