【发布时间】:2020-08-13 03:06:25
【问题描述】:
我想知道空值检查的必要性。
示例代码如下
#include <iostream>
bool twice( int* a )
{
if( a == nullptr )
{
std::cout << "null" << std::endl;
return true;
}
std::cout << *a << std::endl;
*a *= 2;
std::cout << *a << std::endl;
return false;
}
int main()
{
twice( nullptr );
int v = 16;
std::cout << v << std::endl;
twice( &v );
std::cout << v << std::endl;
}
这是输出
null
16
16
32
32
我知道'nullptr'是“指向内存地址零的指针”或“指针变量引用无效时的标志”。
第一季度。内存的零地址每个实内存只有一个?
第二季度。你能在这段代码中重现“指针变量的引用无效”吗?
第三季度。指针变量引用是什么函数失效了?
对不起,我的英语很差。
【问题讨论】:
-
它没有指向内存中的特定部分。这就是为什么尝试使用空指针会崩溃的原因。
-
如果您将函数
twice()更改为接受引用而不是指针,则无需进行空检查。调用者不可能将引用传递给不存在的对象(在您的情况下为int)。是的,调用者可以使用未定义的行为执行操作以创建然后传递无效引用(例如,通过取消引用空指针并传递它)。但是,如果调用者有未定义的行为,那么无论如何,所有的赌注都会被取消——你的函数不能可靠地检测到这种情况,或者安全地处理它。调用者有责任不这样做 -
如果您可以保证(基于您对程序整体逻辑的理解)指针永远不会为空(或者如果您可以调用未定义的行为并可能崩溃,则不需要进行空检查当它为空时你的程序)。
标签: c++ pointers null-pointer