我是C ++的新手。我希望没有指向任何东西的两个指针将被检测为空指针。但是,这仅适用于其中之一。这些指针的物理地址有些不同-0xe00000001与0x0(此指针被正确检测为空指针)。
我编写了以下代码段:
#include <iostream>
using namespace std;
struct TNode {
TNode* Parent; // Pointer to the parent node
TNode* Left; // Pointer to the left child node
TNode* Right; // Pointer to the right child node
int Key; // Some data
};
int main() {
TNode parent;
parent.Key = 2;
TNode first;
first.Key = 1;
first.Parent = &parent;
parent.Left = &first;
cout << first.Left << endl; // get 0xe00000001 here
cout << first.Right <<endl; // get 0x0
if (first.Right == nullptr) {
cout <<"rnull"<<endl; // rnull
}
if (first.Left == nullptr) {
cout <<"lnull"<<endl; // nothing
}
return 0;
}
这是怎么回事?基本上,我想找到一种方法来检查first.Left是否指向空。
答案 0 :(得分:6)
在您的示例中,first.Left
和first.Right
未初始化,不是为空。这意味着它们基本上包含分配它们时堆栈上的所有垃圾。访问实际值(例如,通过打印指针)实际上是未定义的行为,但是对于大多数编译器,如果它们的优化设置较低,则只会打印该垃圾。
如果希望它们为空,则可以修改TNode
,以确保其初始值为空:
struct TNode {
TNode* Parent = nullptr;
TNode* Left = nullptr;
TNode* Right = nullptr;
int Key = 0;
};
int main() {
TNode n; //Everything initialized to null or 0
}
这将确保它们为空。
TNode()
来初始化成员或者,您也可以显式定义构造函数,以使所有内容为空
struct TNode {
TNode* Parent, Left, Right;
// Everything gets default-initialized to null
TNode() : Parent(), Left(), Right() {}
};
int main() {
Tnode n; // Everything initialized to nullptr or 0
}
即使您没有显式定义构造函数,在声明变量时通过放置{}
来显式初始化时,所有内容都将初始化为0(如果为指针,则为null)。
struct TNode {
TNode* Parent, Left, Right;
int Key;
};
int main() {
TNode iAmUninitialized; // This one is uninitialized
Tnode iAmInitialized{}; //This one has all it's members initialized to 0
}
答案 1 :(得分:1)
首先,在C和C ++中,没有指针指向任何东西。无论指针中的值是什么,它都指向某个东西。甚至NULL都是指向地址“ 0”的指针,但按照惯例,我们使用它来表示NULL。未初始化的指针的问题在于,它可以指向任何东西,并且任何东西都可能是非法地址,这将导致异常,或者它指向应用程序中的其他内容,如果修改了数据,则将导致不希望的一面-效果。
在您的情况下,第二个指针为0x00,即为NULL。但是,第一个指针是0x01,并且不为空。