如何解决我们如何检查指针是否为NULL指针?
| 我一直认为简单地将“ 0”做好即可。但是在阅读了这个堆栈溢出问题之后,似乎没有。 那么,在吸收了该问题的所有讨论之后,检查NULL指针的规范方法是什么,即NULL指针可以具有非零值?解决方法
我总是以为if(p!=
NULL){..}即可完成工作。
它会。
, 首先,要100%明确,C和C ++之间没有区别
这里。其次,您引用的堆栈溢出问题不是针对空指针。它引入了无效的指针;至少在
有关标准,仅通过尝试导致未定义的行为
比较它们。通常无法测试指针是否为
有效。
最后,有三种广泛的方法可以检查空指针:
if ( p != NULL ) ...
if ( p != 0 ) ...
if ( p ) ...
所有工作,无论空指针在表述上的表示形式如何
机。所有的一切都以某种方式引起误解;哪一个你
选择是选择最差的问题。正式地,前两个
对于编译器是相同的;常数NULL
或0
被转换
指向类型为“ 4”的空指针以及转换结果
与ѭ4compared比较。不管表示为null
指针。
第三个稍有不同:p
被隐式转换
至bool
。但是隐式转换被定义为p
!= 0
的结果,因此最终得到的结果是相同的。 (这意味着
真的没有使用第三种风格的有效论据,它使人困惑
进行隐式转换,而没有任何补偿利益。)
您更喜欢前两个中的哪一个在很大程度上取决于风格,
可能部分取决于您在其他地方的编程风格:
根据所涉及的习语,其中一种谎言会更麻烦
比其他。如果只是比较的问题,我认为大多数
人们会倾向于NULL
,但在like10ѭ中,
将选择的过载为f( int )
,而不是带有
指针。同样,如果f
是功能模板,f( NULL )
将
在int
上实例化模板。 (当然,有些编译器,例如
如果在非指针上下文中使用NULL
,则g ++将生成警告;
如果您使用g ++,则应该使用NULL
。)
当然,在C ++ 11中,首选惯用法是:
if ( p != nullptr ) ...
,从而避免了其他解决方案的大部分问题。 (但它
与C不兼容:-)。)
, 编译器必须提供一致的类型系统,并提供一组标准转换。整数值0和NULL指针都不需要用全零位表示,但是编译器必须注意将输入文件中的\“ 0 \”标记转换为整数零的正确表示,并将其强制转换为指针类型必须从整数转换为指针表示形式。
这意味着
void *p;
memset(&p,sizeof p);
if(p) { ... }
不能保证在所有目标系统上的行为都一样,因为您在此假设位模式。
例如,我有一个没有内存保护的嵌入式平台,并且将中断向量保持在地址0,因此按照惯例,在转换时,整数和指针与0x2000000进行XOR运算,因此(void *)0指向一个取消引用时会生成总线错误,但是使用if
语句测试指针将首先将其返回为整数表示形式,然后为全零。
, 空指针的实际表示在这里无关紧要。可以将具有零值(包括0
和definition2ѭ的任何有效定义)的整数文字转换为任何指针类型,并给出一个空指针,无论实际表示如何。因此,p != NULL
,p != 0
和p
都是对非空指针的有效测试。
如果编写了类似“ 25”这样的扭曲内容,则可能会遇到null指针的非零表示形式的问题,因此请不要这样做。
尽管我刚刚注意到您的问题被标记为C和C ++。我的答案是针对C ++的,其他语言可能有所不同。您使用哪种语言?
, 显然,您引用的线程约为26。
在C
中,您的摘要将始终有效。我喜欢简单的if (p) { /* ... */ }
。
, 指针的表示与比较它们无关,因为C中的所有比较都是作为值而非表示进行的。比较表示形式的唯一方法是一些令人毛骨悚然的事情:
static const char ptr_rep[sizeof ptr] = { 0 };
if (!memcmp(&ptr,ptr_rep,sizeof ptr)) ...
,嗯,这个问题早在2011年就被问到并得到了回答,但是C ++ 11中有30英镑。这就是我目前正在使用的全部。
您可以从Stack Overflow和本文中阅读更多内容。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。