如何检查C++中的NULL?
比如说,我有一个struct和一个struct数组。我要做的是遍历数组并检查是否有任何项为null。我试着对照NULL和struct*0检查该项,但这似乎不起作用。是否有可靠的方法检查空值 更新示例代码如何检查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 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测试结构对象,用户必须为此定义自己的条件,