对指针安全性的判断(未初始化甚至未置为空)
大家好,不好意思,突然想问一个很菜的问题,希望大家不要叹气。我也是不知道怎么的,突然发现一个很久没有关注的问题,甚至不是疑问的问题,但我现在确实有点纳闷了。我的问题是什么呢,很简单,空指针的判断。
大家知道,一个指针,用起来要很细心,指针都要初始化,或者要置为空,使用的过程中,要先对其进行安全判断,防止程序出现意外崩溃。这些大家肯定都很清楚,这之前不在话下的问题,最近我在写程序的时候,突然不知道如何判断了。
比如:
int* pVal;//这个指针,我还没有给他置空
assert(pVal != NULL);①
if(pVal == NULL)②
{
......
}
或者
char cContext[10];//这个指针,我还没有给他置空
assert(cContext != NULL);①
if(cContext == NULL)②
{
......
}
无论是哪种指针,整形或字符串,不论是用①断言的方式,还是用②,对pVal、*pVal或者cContext、*cContext进行判断,都不起作用,要么是无法判断出来(在VC 6.0下),要么是程序崩溃(在VC 2008下),我就很纳闷。
一直以来就是这么判断的吧,怎么就不行了。我在网上搜了一下,很多人的做法和我的是一样的,还有的人说,指针要初始化,要置空,保持一个好的习惯。但这其实是把问题绕过去了,我可以置空,但我要是团队开发,公共接口,我怎么能确定别人给我传的参数,是安全的。
我现在就是要写一个模块,接受参数,但我怕别人传的指针没有初始化,甚至没有置为NULL,那我该怎么判断呢,请大家帮帮忙。 指针
[解决办法]
1)如果你一直是这样判断的,那么你一直是错的,除非pVal是全局的.局部变量的话pVal是栈上的随机值,而栈空间一般不为空. 所以pVal不为NULL. cContext一般可以不用判断.
2)不清楚你说的不起作用和崩溃是什么意思.
3)如果是别人传给你的指针,你可以判断是否为NULL,但是如果没有初始化,是一个随机值的话,一般你是无法判断的.这个工作是由调用者决定的,你的工作是定义好明确的接口.
[解决办法]
指针可不会抛什么异常,要崩直接崩了
不过你可以把指针操作使用try, catch包含起来, 然后捕获指针异常情况, 只是会影响一点效率, 但代码是安全多了.
[解决办法]
指针可不会抛什么异常,要崩直接崩了
不过你可以把指针操作使用try, catch包含起来, 然后捕获指针异常情况, 只是会影响一点效率, 但代码是安全多了.
在windows下, 可以可使用SEH
详见: http://blog.csdn.net/bodybo/article/details/6050500