Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何检查C++中的NULL?_C++ - Fatal编程技术网

如何检查C++中的NULL?

如何检查C++中的NULL?,c++,C++,比如说,我有一个struct和一个struct数组。我要做的是遍历数组并检查是否有任何项为null。我试着对照NULL和struct*0检查该项,但这似乎不起作用。是否有可靠的方法检查空值 更新示例代码 struct Test{ int a; }; Test testArray[size]; for (int i = 0; i < testCount; i++) { if (testArray[i] == NULL) //this doesnt work {

比如说,我有一个struct和一个struct数组。我要做的是遍历数组并检查是否有任何项为null。我试着对照NULL和struct*0检查该项,但这似乎不起作用。是否有可靠的方法检查空值

更新示例代码

struct Test{
 int a;
};

Test testArray[size];

for (int i = 0; i < testCount; i++)
{
    if (testArray[i] == NULL) //this doesnt work
    {
    }
}
谢谢


RWendi

如果你有结构指针数组,那么你可以检查null。

如果你有结构指针数组,那么你可以检查null。

我不明白;如果您有一个结构数组,那么任何位置怎么可能为空?NULL是一个整数。

我不明白;如果您有一个结构数组,那么任何位置怎么可能为空?NULL是一个整数。

如果您有一个结构数组,那么就没有指针,因此检查NULL没有意义

n个结构的数组实际上是在内存中一个接一个地排列的n个结构

您能否将其更改为指向结构的指针数组,将它们全部初始化为NULL,并根据需要创建它们?我会先研究一下为什么要检查null——感觉好像你做错了什么

编辑添加到问题的代码

您没有展示如何定义testArray,但我怀疑您做了以下工作:

Test testArray[testCount];
Test *testArray[testCount];
for (int i = 0; i < testCount; i++)
{
    testArray[i] = new Test;
}
如果确实需要与null进行比较,请尝试以下操作:

Test testArray[testCount];
Test *testArray[testCount];
for (int i = 0; i < testCount; i++)
{
    testArray[i] = new Test;
}
然后,您将能够通过问题中提供的循环检测到这一点

您能否澄清为什么要与NULL进行比较

它又在不断增长——这一次是为了解决有关初始化的问题:

正如其他人所提到的,与NULL进行比较并不是判断某个内容是否已初始化的有效方法。也许最好的方法是以这样一种方式编写代码,您可以保证它将被初始化

也许最好的办法是在测试结构上放置一个默认构造函数,你可以在C++中这样做,但不是C。
testArray[3] = NULL;
struct A {
    int x;
    A() : x(0) { }
};

我会做得很好的。现在,数组中的所有结构都保证存在,并在其x值设置为0时进行初始化。

如果有一个结构数组,则没有指针,因此检查null是没有意义的

n个结构的数组实际上是在内存中一个接一个地排列的n个结构

您能否将其更改为指向结构的指针数组,将它们全部初始化为NULL,并根据需要创建它们?我会先研究一下为什么要检查null——感觉好像你做错了什么

编辑添加到问题的代码

您没有展示如何定义testArray,但我怀疑您做了以下工作:

Test testArray[testCount];
Test *testArray[testCount];
for (int i = 0; i < testCount; i++)
{
    testArray[i] = new Test;
}
如果确实需要与null进行比较,请尝试以下操作:

Test testArray[testCount];
Test *testArray[testCount];
for (int i = 0; i < testCount; i++)
{
    testArray[i] = new Test;
}
然后,您将能够通过问题中提供的循环检测到这一点

您能否澄清为什么要与NULL进行比较

它又在不断增长——这一次是为了解决有关初始化的问题:

正如其他人所提到的,与NULL进行比较并不是判断某个内容是否已初始化的有效方法。也许最好的方法是以这样一种方式编写代码,您可以保证它将被初始化

也许最好的办法是在测试结构上放置一个默认构造函数,你可以在C++中这样做,但不是C。
testArray[3] = NULL;
struct A {
    int x;
    A() : x(0) { }
};

我会做得很好的。现在,数组中的所有结构都保证存在,并在x值设置为0时进行初始化。

您可以通过比较0或使用布尔运算符(如

if (ptr)
{
  //not null
}

if (!ptr)
{
  //null
}

if (ptr == 0)
{
  //null
}

if (ptr != 0)
{
  //not null
}
如果您有一个指针数组,请记住,您需要事先显式初始化所有指向null的未分配元素指针:如果您没有初始化它们,它们将包含随机非null值:

const char* array[5]; //an array of 5 pointers
array[0] = "Hello";
array[1] = "World";
//at this moment, array[2] hasn't been initialized: it's value
//is therefore unknown/undefined/random, not necessarily null.

您可以通过比较0或使用布尔运算符(如

if (ptr)
{
  //not null
}

if (!ptr)
{
  //null
}

if (ptr == 0)
{
  //null
}

if (ptr != 0)
{
  //not null
}
如果您有一个指针数组,请记住,您需要事先显式初始化所有指向null的未分配元素指针:如果您没有初始化它们,它们将包含随机非null值:

const char* array[5]; //an array of 5 pointers
array[0] = "Hello";
array[1] = "World";
//at this moment, array[2] hasn't been initialized: it's value
//is therefore unknown/undefined/random, not necessarily null.

您的编译器可能正在调试时将这些值设置为某个幻数

例如,如果在Visual Studio 2008中运行以下命令,并在调试模式下编译,并在“return 0;”处设置断点语句“foo”指向0xCCCC

struct Foo {
    int Bar;
};

int main(int argc, char **argv) {
    Foo *foo; // foo points to 0xCCCCCCCC
    return 0;
}

您的编译器可能正在调试时将这些值设置为某个幻数

例如,如果在Visual Studio 2008中运行以下命令,并在调试模式下编译,并在“return 0;”处设置断点语句“foo”指向0xCCCC

struct Foo {
    int Bar;
};

int main(int argc, char **argv) {
    Foo *foo; // foo points to 0xCCCCCCCC
    return 0;
}
为什么不使用std::vector

为什么不使用std::vector


无论出于何种原因,如果您必须针对NULL测试struct objec

您可以重载运算符==

struct Test
{
    int a;
    bool operator==(const Test const * arobj)
    {
        return true;// true/false on your condition
    }
};

不管什么原因,如果你必须测试你的struc 反对无效

您可以重载运算符==

struct Test
{
    int a;
    bool operator==(const Test const * arobj)
    {
        return true;// true/false on your condition
    }
};


结构不能为空,指向结构的指针可以为空。让我们来看一些定义和初始化testArrayI的代码,我敢打赌它是。。。Test testArray[size]…您能告诉我们为什么要与NULL进行比较吗?因为不是每个项都将被初始化。结构不能为NULL,指向结构的指针可以为NULL。让我们看一些定义和初始化testArray的代码。我打赌它是。。。Test testArray[size]…您能告诉我们为什么要将其与NULL进行比较吗?因为不是每个项目都将被初始化。回答得很好Martin。感谢堆。如果通过初始化他意味着不是所有成员都必须被创建,即一些可能为空,那么添加构造函数实际上并不能解决问题。仍然可能存在只初始化数组的一部分的情况。不,如果您有默认构造函数,并且定义了该类型的数组,那么将为数组的每个元素调用构造函数。试试看:用我的例子,但是抛出'std::cout't很棒的答案Martin。感谢堆。如果通过初始化他意味着不是所有成员都必须被创建,即一些可能为空,那么添加构造函数实际上并不能解决问题。仍然可能存在只初始化数组的一部分的情况。不,如果您有默认构造函数,并且定义了该类型的数组,那么将为数组的每个元素调用构造函数。试试看:用我的例子,但是throw'std::cout NULL不是整数。它是一个不指向任何内容的指针的表示形式。沿着这条路走下去会导致madness.OK,但关键是结构数组中的任何元素都不会为NULL,将结构与NULL进行比较甚至是不合法的。@Martin:NULL不是整数。它是一个不指向任何内容的指针的表示形式。沿着这条路走下去会导致疯狂。好吧,但关键是结构数组中的任何元素都不会为NULL,将结构与NULL进行比较甚至是不合法的。@Martin:Ahhh。。。为什么?你怎么能有意义地将NULL与结构进行比较?这只能确保你可以在你的结构上使用operator=,现在它的用户术语来定义条件,这就是为什么我说的:无论出于什么原因,如果你必须针对NULL测试你的结构对象,用户必须为此定义自己的条件,啊。。。为什么?如何有意义地将NULL与结构进行比较?这只能确保在结构上使用operator=,现在它的用户术语用于定义条件,这就是为什么我说的原因:无论出于何种原因,如果必须针对NULL测试结构对象,用户必须为此定义自己的条件,