C++ 是空指针';s的解引用也等于NULL?

C++ 是空指针';s的解引用也等于NULL?,c++,pointers,null,dereference,C++,Pointers,Null,Dereference,以下代码段是否编译/执行if语句中的块 int* pointer = NULL; int deref = *pointer; if(deref == NULL){ // will execute? } 由于指针变量包含NULL,该指针变量的解引用是否也会返回NULL,或者这会导致运行时错误?结果是“未定义的行为”,这可能会或可能不会触发运行时错误,并且在任何情况下都应该避免。当前的答案很好地解决了UB问题。不过,我想补充一点。如果运行此代码: if(0==NULL){ std::c

以下代码段是否编译/执行if语句中的块

int* pointer = NULL;
int deref = *pointer;
if(deref == NULL){
  // will execute?
}

由于
指针
变量包含NULL,该指针变量的解引用是否也会返回NULL,或者这会导致运行时错误?

结果是“未定义的行为”,这可能会或可能不会触发运行时错误,并且在任何情况下都应该避免。

当前的答案很好地解决了UB问题。不过,我想补充一点。如果运行此代码:

if(0==NULL){
    std::cout << "True";
}
if(0==NULL){
std::cout一旦设置:

int* pointer = NULL;
指针不指向任何内容。现在,当您编写以下内容时:

int deref = *pointer;
deref将尝试访问指针指向的内容,这将导致未定义的行为类似分段错误


我希望这可以解释。

中的内容不可能dereferenced@LưuVĩnhPhúc ISO c标准没有对空指针的解引用施加任何类似“不可能发生”的要求。这是一种未定义的行为,事实上可以在某些环境中进行,并且可以作为有文档记录的语言扩展提供(显然,这不是一个经过深思熟虑的方案).历史上,C程序员利用可取消引用的空指针简化链表或树数据结构中的情况时有发生。您可以执行类似于
head\u node->next->prev=that
的操作,而不必担心
nead\u node->next
是终止的空链接。显然,该代码被发现不可移植对捕获空引用的环境来说,OOP!这不是错误的;它在原始目标平台上运行良好,代码被传输到快乐的终端用户。它是不可移植的。@ KAZ C不是一个被提及的标签——只是C++。@ L*UVXNHPH C“不能”。不是完全正确。可以这样做,但结果是未定义的。只是指出您的示例没有取消引用
NULL
,但下面一段确实谈到了这一点。您的意图是什么?@JohannGerell我只是想通知OP,他的代码可能在某些机器上工作,并在if stat中执行指令这个行为仍然没有定义,但是一些程序员可能认为它是定义的,因为它正在工作,并且行为与他们的意图相似。因此,我认为这是值得一提的。那么,您要解决的是示例中的“0”if(0==NULL)时的情况
碰巧是某个平台上取消引用空指针的结果,对吧?我对你是如何表述的感到困惑。是的,这正是我的意思