C语言的核心和灵魂

点击蓝字

231d12e2e5bf225b1f136113c0d2fbed.png

关注我们

提起C语言大部分开发者很自然就会想到指针二字,没错,作为C的核心和灵魂,它的地位咱们就不再赘述了。

今天我们想跟大家讲的是指针中的两个特有名词:“悬空指针”和“野指针”。

悬空指针

C语言中的指针可以指向一块内存,如果这块内存稍后被操作系统回收(被释放),但是指针仍然指向这块内存,那么,此时该指针就是“悬空指针”。下面这段C语言代码是一个例子,请看:

void *p = malloc(size);
assert(p);
free(p); 
// 现在 p 是“悬空指针”

C语言中的“悬空指针”会引发不可预知的错误,而且这种错误一旦发生,很难定位。这是因为在 free(p) 之后,p 指针仍然指向之前分配的内存,如果这块内存暂时可以被程序访问并且不会造成冲突,那么之后使用 p 并不会引发错误。

最难调试的 bug 总是不能轻易复现的 bug,对不?

所以在实际的C语言程序开发中,为了避免出现“悬空指针”引发不可预知的错误,在释放内存之后,常常会将指针 p 赋值为 NULL:

void *p = malloc(size);
assert(p);
free(p); 
// 避免“悬空指针”
p = NULL;

这么做的好处是一旦再次使用被释放的指针 p,就会立刻引发“段错误”,程序员也就能立刻知道应该修改C语言代码了。

野指针

上面我们讲的“悬空指针”是指向被释放内存的指针,“野指针”则是不确定其具体指向的指针。“野指针”最常来自于未初始化的指针,例如下面这段C语言代码:

void *p;
// 此时 p 是“野指针”

因为“野指针”可能指向任意内存段,因此它可能会损坏正常的数据,也有可能引发其他未知错误,所以C语言中的“野指针”危害性甚至比“悬空指针”还要严重。在实际的C语言程序开发中,定义指针时,一般都要尽量避免“野指针”的出现(赋初值):

void *p = NULL;
void *data = malloc(size);

这两点内容,是C语言比较重要的内容,希望大家在编码的时候一定要注意。

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

fa1c0338d71de062e13a73b9e605da35.png

8a0ff15256fecf8f2b9bc0c07afd3fde.gif

戳“阅读原文”我们一起进步

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

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

相关文章

gradle排除依赖_如何从Gradle中的所有依赖项中排除库

gradle排除依赖我正在使用Spring Boot。 默认情况下,Spring Boot带有Logback。 我想使用log4j(出于任何原因..) 为了做到这一点,我不得不排除logback并添加新的log4j依赖项: 在此软件包中“隐藏”了logback&#xff…

android搜索功能xml,Android_Android ActionBar搜索功能用法详解,本文实例讲述了Android ActionBar - phpStudy...

Android ActionBar搜索功能用法详解本文实例讲述了Android ActionBar搜索功能用法。分享给大家供大家参考,具体如下:使用ActionBar SearchView时的注意点:首先要吐槽一下Android的官方Guide文档 ,关于用法讲得不明确,可…

javaone_JavaOne 2015 –提交技巧和建议

javaone大家都知道JavaOne 。 感觉就像一直存在。 而且,即使我们跌宕起伏,而地理位置也不是我们想要的那样,旧金山也很昂贵,而且和。 这是有关各种Java的顶级会议。 今年又再次成为程序委员会(“ Java,DevO…

C语言_结构体总结,附实例源码

点击蓝字关注我们当前文章介绍动态堆空间内存分配与释放,C语言结构体定义、初始化、赋值、结构体数组、结构体指针的相关知识点,最后通过一个学生管理系统综合练习结构体数组的使用。1. 动态内存管理C语言代码----->编译----->链接------>可执行…

android webview file,Android WebView 不支持 H5 input type=file 解决方法

最近因为赶项目进度,因此将本来要用原生控件实现的界面,自己做了H5并嵌入webview中。发现点击H5中 input type"file" 标签 不能打开android资源管理器。通过网络搜索发现是因为 android webview 由于考虑安全原因屏蔽了 input type"file&…

maven 常量字符串过长_从基于Maven的Web应用程序获取版本字符串

maven 常量字符串过长打包maven项目时,它将自动在其中生成pom.properties文件,其中将包含版本,artifactId和groupId信息。 这些在运行时很方便拥有并显示给您的Web应用程序。 可以使用如下方法检索它。 public class Application {private S…

四大C语言知识总结

点击蓝字关注我们1、#define宏定义以#号开头的都是编译预处理指令,它们不是C语言的成分,但是C程序离不开它们,#define用来定义一个宏,程序在预处理阶段将用define定义的来内容进行了替换。因此在程序运行时,常量表中并…

android 5.0新增 ui 控件,android3.0新增ui控件示例说明.doc

android3.0新增ui控件示例说明Android3.0新增UI控件AdapterViewAnimator控件AdapterViewAnimator(堆View),已知子类有AdapterViewFlipper, StackView,是一系列View的集合,这些View叠加一起,并且View之间可以进行切换,并…

jdbc select语句_SELECT语句使用JDBC和Hibernate批量获取

jdbc select语句介绍 现在,我已经介绍了Hibernate对INSERT , UPDATE和DELETE语句的批处理支持,是时候分析SELECT语句结果集的批量提取了。 JDBC ResultSet提供了一个客户端Proxy游标,用于获取当前语句的返回数据。 执行该语句后&…

看懂开源项目,你得熟悉这几个 C++11 新特性

点击蓝字关注我们C11 中增加了许多的新特性。在本文中,我们来聊一下 lambda 表达式,闭包,std::function以及std::bind。lambda 表达式C11 中新增了 lambda 表达式这一语言特性。lambda 表达式可以让我们快速和便捷的创建一个 “函数”。下面是…

5元素升级android6,【五元素ifive X.7】无障碍升级,ifveX详细升级固件教程,快为爱机升级吧。...

android系统的乐趣就是可以随意的刷机,所以拿到如此高配置的ifiveX也是想随时体验最新的android系统。而很多朋友可能只会用设备,刷机这种比较技术性的动作就不太会弄了。也就在这周,才帮同事刷RUU把已经无法启动的G12刷了回来。所以刷机还是…

昆仑通态复制的程序可以用吗_昆仑通态专题(七):MCGS组态软件的设备窗口...

点击上方蓝色字体,关注我们设备窗口是MCGS嵌入版组态软件系统的重要组成部分,在设备窗口中建立系统与外部硬件设备的连接关系,使系统能够从外部设备读取数据并控制外部设备的工作状态,实现对工业过程设备的实时监控与操作。01 设备…

spicy命令_Spicy Spring:动态创建自己的BeanDefinition

spicy命令当我们拥有Spring托管的应用程序时,我们想让Spring管理所有的bean。 除了使用已知解决方案(例如带注释的bean,Java配置和XML配置)创建bean的常规方法之外,还有一种方法可以用来创建自己的BeanDefinition 。 …

设置数字范围的html语言,JavaScript奇技淫巧44招【实用】

JavaScript是一个绝冠全球的编程语言,可用于Web开发、移动应用开发(PhoneGap、Appcelerator)、服务器端开发(Node.js和Wakanda)等等。JavaScript还是很多新手踏入编程世界的第一个语言。既可以用来显示浏览器中的简单提示框,也可以通过nodebot或nodruino…

嵌入式C语言程序调试和宏使用的技巧

点击蓝字关注我们01.调试相关的宏在Linux使用gcc编译程序的时候,对于调试的语句还具有一些特殊的语法。gcc编译的过程中,会生成一些宏,可以使用这些宏分别打印当前源文件的信息,主要内容是当前的文件、当前运行的函数和当前的程序…

matlab中欠定方程组超定方程组_《数值天气预报》:球坐标系中的基本方程组

人们是如何预报天气的?目前的预报方法主要有两种:一种是基于由各种探测资料绘制的天气图,结合历史资料进行分析预测;另一种是基于大气方程组,利用数值解法对其进行求解,从而得到未来时刻的大气状态。后者就…

浏览器总是跳转到缓存界面_跳转到企业缓存之前要考虑的事项

浏览器总是跳转到缓存界面介绍 关系数据库事务是ACID ,强大的一致性模型简化了应用程序开发。 由于启用Hibernate缓存是一项配置 ,因此,只要数据访问层开始出现性能问题,就转向缓存非常吸引人。 添加缓存层确实可以提高应用程序性…

html标签转换日期格式,input标签的type为date,显示的日期格式样式更改

这个///是改不了---的,这是谷哥自带的功能样式,只能改颜色背景色等,如果要那种效果可以用日历插件有个取巧的方法,一个不能改的input覆盖在input type"date"上面*{margin: 0;padding: 0;}#div{width: 500px;height: 300…

CryptoTab 服务器_如何架设FTP服务器,如何架设FTP服务器,具体架设方法

FTP服务器,则是在互联网上提供存储空间的计算机,它们依照FTP协议提供服务。 FTP的全称是File Transfer Protocol(文件传输协议)。顾名思义,就是专门用来传输文件的协议。简单地说,支持FTP协议的服务器就是FTP服务器。那么&#xf…

C语言和C++的区别和联系

点击蓝字关注我们C语言和C到底是什么关系?首先C和C语言本来就是两种不同的编程语言,但C确实是对C语言的扩充和延伸,并且对C语言提供后向兼容的能力。对于有些人说的C完全就包含了C语言的说法也并没有错。C一开始被本贾尼斯特劳斯特卢普&#…