如何在c ++中检查NULL?

时间:2009-09-23 00:50:46

标签: 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
    {
    }
}

谢谢,

RWendi

7 个答案:

答案 0 :(得分:18)

如果你有一个结构数组,那么没有指针,所以检查null是没有意义的。

n个结构的数组实际上是在记忆中一个接一个地排列的结构中的n个。

你能把它改成一个指向结构的指针数组,将它们全部初始化为NULL,并根据需要创建它们吗?我会考虑为什么你想要先检查是否为null - 感觉你做错了。

(编辑添加到问题的代码)

您没有展示如何定义testArray,但我怀疑您已完成以下操作:

Test testArray[testCount];

如果您确实需要与null进行比较,请尝试以下操作:

Test *testArray[testCount];
for (int i = 0; i < testCount; i++)
{
    testArray[i] = new Test;
}

此时,所有条目都不是NULL,但如果稍后在代码中执行以下操作:

testArray[3] = NULL;

然后你将能够通过你在问题中提供的循环来检测它。

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

(并且它继续增长 - 这次是为了解决有关初始化的问题):

正如其他人所提到的,与NULL比较并不是判断某些事情是否被初始化的有效方式。可能最好的方法是编写代码,以保证它将被初始化。

执行此操作的最佳方法可能是在Test结构上放置一个默认构造函数(您可以在C ++中执行此操作,但不能在C中执行此操作)。类似的东西:

struct A {
    int x;
    A() : x(0) { }
};

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

答案 1 :(得分:4)

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

答案 2 :(得分:2)

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

)来测试指针是否为空
if (ptr)
{
  //not null
}

if (!ptr)
{
  //null
}

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

if (ptr != 0)
{
  //not 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.

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

例如,如果在Visual Studio 2008中运行以下命令并在“调试”模式下编译并在“返回0”处设置断点;声明,'foo'指向0xCCCCCCCC。

struct Foo {
    int Bar;
};

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

答案 5 :(得分:0)

为什么不使用std::vector

std::vector<Test> my_list
Test obj;

my_list.push_back(obj);
std::cout << my_list.size();
my_list[0].a = 42;

my_list.push_back(obj);
std::cout << my_list.size();
my_list[my_list.size()-1].a = 4711;

答案 6 :(得分:0)

出于任何原因,如果您必须针对NULL测试结构对象

您可以重载operator ==

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