C++ 检查char*是否为NULL或空时取消引用NULL指针警告

C++ 检查char*是否为NULL或空时取消引用NULL指针警告,c++,pointers,dereference,C++,Pointers,Dereference,简单地说,我通过if语句检查两个char*是否为null ptr或为空,但我收到一条警告,说我正在解引用null指针 // mplate is a reference to a class if ((mplate.m_plate != nullptr || mplate.m_plate[0] != '\0') || (plate != nullptr || plate[0] != '\0')) { // Do something } else { // do something else }

简单地说,我通过
if
语句检查两个char*是否为null ptr或为空,但我收到一条警告,说我正在解引用null指针

// mplate is a reference to a class
if ((mplate.m_plate != nullptr || mplate.m_plate[0] != '\0') || (plate != nullptr || plate[0] != '\0')) {
// Do something
}
else {
// do something else
}
所以基本上我想在
if
语句中说,如果
mplate.mplate
plate
为空或
nullptr
执行此操作,否则执行其他操作

Severity    Code    Description Project File    Line    Suppression State
Warning C6011   Dereferencing NULL pointer 'make'.
Warning C6011   Dereferencing NULL pointer 'model'.
Warning C6011   Dereferencing NULL pointer 'mplate.m_plate'.
Warning C6011   Dereferencing NULL pointer 'plate'.
Warning C6011   Dereferencing NULL pointer 'plate'.

你在做类似的事情

if (p != nullptr || *p)
i、 e.仅当指针为
nullptr
时,才解除引用。这意味着如果指针有效,则不执行任何操作;如果指针无效(即UB),则取消引用

您需要执行逻辑
,如下所示

if (p != nullptr && *p)

i、 e.仅当指针不是
nullptr
时才取消引用您正在执行以下操作

if (p != nullptr || *p)
i、 e.仅当指针为
nullptr
时,才解除引用。这意味着如果指针有效,则不执行任何操作;如果指针无效(即UB),则取消引用

您需要执行逻辑
,如下所示

if (p != nullptr && *p)

i、 e.仅当指针不是
nullptr
时才取消引用。如果指针为NULL或指向
'\0'
,您的问题说明您希望执行
if
块,因此您确实希望:

//mplate是对类的引用
如果(mplate.m|u plate==nullptr | | mplate.m| plate[0]='\0'| | plate==nullptr | | plate[0]='\0'){
//执行某些操作(在第一次真实测试中输入的块…)
}
否则{
//执行其他操作(仅当所有四个测试都为假时才输入块…)
}

在该代码中,
if
语句中的测试将在任何一个测试为
true
时“短路”,因此您将永远不会取消引用
nullptr

您的问题表明,如果指针为NULL或指向
'\0',您希望执行
if
块,所以你真的想要这个:

//mplate是对类的引用
如果(mplate.m|u plate==nullptr | | mplate.m| plate[0]='\0'| | plate==nullptr | | plate[0]='\0'){
//执行某些操作(在第一次真实测试中输入的块…)
}
否则{
//执行其他操作(仅当所有四个测试都为假时才输入块…)
}

在此代码中,
if
语句中的测试将在任何一个测试为
true
时“短路”,因此您永远不会取消引用
nullptr

您可以复制整个警告吗?包括错误等。简单地说,在继续之前,您希望这两个条件都是
true
,因此正确的逻辑操作是
&
,而不是
|
。表达式
(mplate.m|plate!=nullptr| mplate.m|plate[0]!='\0')
-这是
if()中测试的一部分
-仅当
mplate.m\u plate
为空时,才会计算
mplate.m\u plate[0]
-因此将给出未定义的行为。您需要在该表达式中使用
&&
而不是
|
。您可以复制整个警告吗?包括错误等。简单地说,在继续之前,您希望这两个条件都是
true
,因此正确的逻辑操作是
&
,而不是
|
。表达式
(mplate.m|plate!=nullptr| mplate.m|plate[0]!='\0')
-这是
if()中测试的一部分
-仅当
mplate.m\u plate
为空时,才会计算
mplate.m\u plate[0]
-因此将给出未定义的行为。在该表达式中需要
&&
而不是
|
。事实上,
p!=如果
p
nullptr
,则nullptr | |*p
仅为解引用
*p
。所以它要么什么也不做,要么导致未定义的行为。事实上,
p!=如果
p
nullptr
,则nullptr | |*p
仅为解引用
*p
。因此,它要么什么也不做,要么导致未定义的行为。