指针
C语言-野指针处理
指针的基本概念
从概念上看,每一个指针都包括2个部分:
-
内存中的某处位置
内存中的一个位置就是一个地址,常用16进制形式表示。指针本身只包括这个地址,为了使用该地址所指向的数据,就必须访问该地址,解释该地址的内存内容。必须经过解释才能使它变得有意义。 -
以及如何解释该位置中的内容
是由指针的基本类型(base type)决定的。如果某指针指向整数,这就意味着编译器会把该指针所指向的内存位置的数据解释为一个整数。当然,你可以让一个整数指针,一个字符串指针和一个浮点数指针都指向同一个内存位置。但是其中(至多)只有一个指针能正确地解释该位置的内容。
使用指针的一般技巧
正确地使用指针要求程序员采用一种双向策略。第一,要首先避免造成指针错误。其次,在编写代码之后尽快地检测出指针错误来。
下面是一些措施:
-
把指针操作限制在子程序或者类里面
-
同时声明和定义指针
-
在与指针分配相同的作用域中删除指针
-
在使用指针之前检查指针
-
先检查指针所引用的变量在使用它
-
增加明显的冗余
C指针
-
使用显示指针类型而不是默认类型
C允许对任何类型的变量使用char或者void指针,C语言只关心这类指针有所指向,不会真正去关心它所指向的是什么。然后,如果你使用了显式的指针类型,编译器就会针对不相符的指针类型和不合适的解除引用发出警告。如果你不这样做,它就不发警告。因此,请尽可能地使用显式的指针类型。
采纳这项规则的必然结果是,当你必须进行类型转换的时候要使用显式类型转换。
-
避免强制类型转换
如果需要强制类型转换,那么就是在你的防御式编程的铠甲上挖了个洞,一个需要很多强制类型转换的程序在架构方面可能就存在一些需 要修正的问题,如果可能,请重新做设计;否则,就应该尽可能地避免强制类型转换。
-
遵循参数传递的型号规则
在C语言里,只有当你在赋值语句的参数前面加上了星号(*),才能把该参数从子程序中传回去。
-
在内存分配中使用sizeof()确定变量的大小
注意事项
- 把指针操作隔离在子程序里吗?
- 指针引用合法吗?或者说指针有可能成为空悬指针吗?
- 代码在使用指针之前检查他的有效性吗?
- 在使用指针所指向的变量之前检查其有效性吗?
- 指针用完后被设置为空值吗?
- 就可读性而言,代码用了所有需要使用的指针变量吗?
- 链表中的指针是按正确的顺序加以释放吗?
- 程序分配了一片保留的内存后备区域,一遍在耗尽内存的时候能够优雅地退出吗?
- 是不是在没有其他方法可用的情况下最终才使用指针的?
要点
指针很容易出错。用访问子程序或类以及防御式编程实践来保护自己的代码。
本文深入探讨C语言中的指针概念,解析野指针处理技巧,强调指针使用前的有效性检查,以及如何通过显式类型提升代码安全性。文章还提供了一系列防御式编程策略,帮助读者避免和检测指针错误。
544

被折叠的 条评论
为什么被折叠?



