是否指针指定或不在C?
你的意思是if (badptr==NULL)
?
请注意,当您定义它或当您“取消分配它”(例如,您删除它所引用的对象)时,您必须首先将您的指针设置为NULL。否则,它将包含垃圾,并且此测试将失败,因为值不会为0.
您也可以将比较结果设置为0而不是NULL,因为已经有足够的参数,因此这是正确的形式,所以我赢了不要重复他们。
char *ptr=NULL;
initalize the pointer to NULL
;那么稍后您可以检查它是否为NULL
,以确定它是否有效,然后再尝试遵守它。
您可以安装信号处理程序SIGSEGV
,然后尝试取消引用指针 - 如果你发现自己讯号处理器中,指针不分配(或指向无效的内存地址,这基本上是同样的事情)
但是,可能存在未分配的指针指向属于进程内存空间的有效地址的情况 - 在这种情况下,将不会引发SIGSEGV
。
一个downvoter会如此善意解释downvote?无论出于何种原因,您可能都不喜欢这个答案,但这并没有错。 – qrdl 2010-06-07 17:42:16
如果您使用信号处理程序并尝试解引用指针并将指针指向可用内存外的区域,则会抛出一个仅允许抛出一次的奇怪异常。然后,当您稍后尝试分配内存时,分配器将查找该异常以查看是否需要增加地址空间并且不会看到它,并且事情不会正常工作。请注意,以前的所有文本都略有偏差,因为我从一篇文章中相当朦胧的回忆中写下了这篇文章,这篇文章解释了为什么尝试通过取消引用验证内存是一个坏主意。 – Brian 2010-06-07 22:08:30
@Brian你在说什么异常?问题是关于C而不是C++,C没有任何例外。我写了关于信号的信号,不是例外,信号是一个非常不同的东西。我认为你混淆了两个完全不同的概念。 – qrdl 2010-06-08 06:59:54
在C++
当int
变量未被赋值时,它们的初始值为2686392!
您可以使用宏,它不会工作:
#define NP_CHECK(ptr) \
{ \
if (ptr == NULL) { \
fprintf(stderr, "%s:%d NULL POINTER: %s\n", \
__FILE__, __LINE__, #ptr); \
exit(-1); \
} \
} \
注:这是可能的,你会在试图解决这个问题的过程中,发现一个叫做'IsBadPtr'功能。 **不要使用它!** – Brian 2010-06-03 15:04:00
为什么不使用isbadptr? – gkaykck 2010-06-03 15:44:42
阅读http://blogs.msdn.com/b/oldnewthing/archive/2006/09/27/773741.aspx – Brian 2010-06-08 11:35:25