对指针安全性的判断(未初始化甚至未置为空),该怎么处理

对指针安全性的判断(未初始化甚至未置为空)
大家好,不好意思,突然想问一个很菜的问题,希望大家不要叹气。我也是不知道怎么的,突然发现一个很久没有关注的问题,甚至不是疑问的问题,但我现在确实有点纳闷了。我的问题是什么呢,很简单,空指针的判断。
大家知道,一个指针,用起来要很细心,指针都要初始化,或者要置为空,使用的过程中,要先对其进行安全判断,防止程序出现意外崩溃。这些大家肯定都很清楚,这之前不在话下的问题,最近我在写程序的时候,突然不知道如何判断了。
比如:
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,但是如果没有初始化,是一个随机值的话,一般你是无法判断的.这个工作是由调用者决定的,你的工作是定义好明确的接口.
------解决思路----------------------
引用:
Quote: 引用:


确定你的参数是输入函数输出!
1如果是输入,首先判断不为NULL,然后判断第一个字节不为‘\0’
2如果是输出,判断是否为NULL即可(当然需要分配空间的则估计传参是双指针了),
  然后自己清空数据,再填充
  
团队工作,协定好相关协议比较靠谱,便于日后维护问题阿!


我没明白你的意思,不知道你是否明白我的意思。
我现在就是判断NULL不起作用啊,你具体说怎么判断呢。


不起作用是什么意思?传过来的是NULL,判断为NULL不成立?不起作用?
------解决思路----------------------
对于函数或者模块来说,该你负责的事情做好。
至于传进来的不是NULL,而是没初始化的指针,指向垃圾值,这不属于你负责。
应该由函数调用者来负责他传给你的参数的初始化。

对于数据类型,规定一个边界,超过可以认为错误数据,指针怎么判断?

拿你举的电视机来比喻,常规的用户是把电视接在220V的电源上,能正确工作。
有个用户非要接5000V的电源,电视机炸了这能怪电视机厂吗。

------解决思路----------------------
引用:
Quote: 引用:

不过你可以把指针操作使用try, catch包含起来, 然后捕获指针异常情况, 只是会影响一点效率, 但代码是安全多了.
指针可不会抛什么异常,要崩直接崩了


在windows下, 可以可使用SEH
详见: http://blog.****.net/bodybo/article/details/6050500
------解决思路----------------------
引用:
Quote: 引用:

Quote: 引用:

不过你可以把指针操作使用try, catch包含起来, 然后捕获指针异常情况, 只是会影响一点效率, 但代码是安全多了.
指针可不会抛什么异常,要崩直接崩了


在windows下, 可以可使用SEH
详见: http://blog.****.net/bodybo/article/details/6050500

++
如果是windows环境,可以用windows的异常处理。
函数的返回值可以做成bool型的,如果没异常,返回true,如果捉到异常,返回false
------解决思路----------------------
野指针的危害很大,你的程序就是遇到野指针判断不出来,但是这不能怪你,因为野指针本来就是无法检测的,如果你想要保证你的程序不崩溃,可以在对指针解引用失败的时候抛出异常,弹出一个提示框提示一下是非法指针