取消引用NULL指针的哪一部分会导致意外行为?

2 c++

我很好奇解除引用NULL ptr的哪一部分会导致不良行为.例:

//  #1
someObj * a;
a = NULL;
(*a).somefunc();   // crash, dereferenced a null ptr and called one of its function
                   // same as a->somefunc();

//  #2
someObj * b;
anotherObj * c;
b = NULL;
c->anotherfunc(*b);   // dereferenced the ptr, but didn't call one of it's functions
Run Code Online (Sandbox Code Playgroud)

在这里我们在#2中看到我实际上并没有尝试从b中访问数据或函数,所以如果*b刚解析为NULL并且我们将NULL传递给anotherfunc(),这仍会导致意外行为吗?

Dav*_*ley 6

标准中有一个空指针值的概念.当程序试图通过它访问内存时,这是一个导致未定义行为的独特值.在实践中,许多现代实现使程序崩溃,这是有用的行为.毕竟,这样的尝试是一个错误.

空指针值的名称是0指针上下文中的任何其他常量整型表达式(例如3 - 3,如).还有一个NULL宏,它必须在C++中评估为0,但可以(void *)0在C中(C++更坚持指针是类型安全的).在C++ 0x中,将调用一个显式值nullptr,最后给空指针一个显式名称.

空指针的值不必是实际的零,虽然它在我所知道的所有实现上,并且那些不起作用的奇怪计算机大部分已经退役.

你错了上一个例子中发生的事情. *b没有解决任何问题.传递*b是未定义的行为,这意味着实现可以用它做任何它喜欢的事情.它可能会或可能不会被标记为错误,并且可能会或可能不会导致问题.行为可以在没有明显原因的情况下改变,因此这样做是错误的.

如果被调用函数期望指针值,则传递空指针值是完全合法的,并且被调用函数应该正确处理它.取消引用空指针值永远不合法.