代码之家  ›  专栏  ›  技术社区  ›  RWendi

如何检查C++中的NULL?

c++
  •  1
  • RWendi  · 技术社区  · 15 年前

    例如,我有一个结构和一个结构数组。我要做的是遍历数组并检查是否有任何项是空的。我试图检查该项是否为空和(结构*)0,但这似乎不起作用。有没有可靠的方法来检查空值?

    更新示例代码

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

    谢谢,

    伦迪

    7 回复  |  直到 15 年前
        1
  •  18
  •   Martin    15 年前

    如果您有一个结构数组,那么就没有指针,因此检查空值是没有意义的。

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

    可以将其更改为指向结构的指针数组,将它们全部初始化为空,然后根据需要创建它们吗?我会调查的 为什么? 你想先检查一下是否为空-感觉你做错了什么。

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

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

    Test testArray[testCount];
    

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

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

    此时,所有条目都不会为空,但如果在代码的后面执行以下操作:

    testArray[3] = NULL;
    

    然后,您将能够通过问题中提供的循环检测到这一点。

    你能澄清吗? 为什么? 要与空值比较吗?

    (而且它还在不断增长——这次是为了解决有关初始化的问题):

    正如其他人提到的,与空值比较并不是判断某个东西是否初始化的有效方法。最好的方法可能是以这样一种方式编写代码,即您保证它将被初始化。

    也许最好的办法是在测试结构上放置一个默认构造函数(可以用C++来做,但不能用C来做)。类似:

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

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

        2
  •  4
  •   Ed Swangren    15 年前

    我不明白;如果您有一个结构数组,那么这些位置中的任何一个都可以为空?空是一个整数。

        3
  •  2
  •   ChrisW    15 年前

    您可以通过比较0或使用布尔运算符(如…)来测试指针是否为空。

    if (ptr)
    {
      //not null
    }
    
    if (!ptr)
    {
      //null
    }
    
    if (ptr == 0)
    {
      //null
    }
    
    if (ptr != 0)
    {
      //not 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.
    
        4
  •  0
  •   leiz    15 年前

    如果您有结构指针数组,那么可以检查是否为空。

        5
  •  0
  •   xian    15 年前

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

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

    struct Foo {
        int Bar;
    };
    
    int main(int argc, char **argv) {
        Foo *foo; // foo points to 0xCCCCCCCC
        return 0;
    }
    
        6
  •  0
  •   sbi    15 年前

    你为什么不用 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;
    
        7
  •  0
  •   sbi    15 年前

    因为任何原因,如果必须测试结构对象是否为空

    你可以超载操作员==

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