比方说,我有一个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
答案 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
}
};