c++指针不工作
C++ pointers not working?
我在使用c++指针时遇到一个问题。我试图通过使用节点结构和树结构来编码一个伸展树。然而,在测试中,我遇到了一个问题。我的代码不能工作的部分在下面:
struct Node {
Node* l, *r, *p;
int v;
Node() {}
Node(int _v, Node* _p) : v(_v), p(_p) {}
};
struct Tree {
Node* root;
Tree() : root(0) {}
//...
void insert(int k) {
if (!root) {
root = new Node(k, 0);
return;
}
Node* cur = new Node();
cur->v = root->v;
while (1) {
int x = cur->v;
cout << x << endl;
return;
if (k <= x) {
//cout << x << endl;
//return;
if (!cur->l) {
cur->l = new Node(k, cur);
//splay(cur->l);
return;
} else cur = cur->l;
} else {
if (!cur->r) {
cur->r = new Node(k, cur);
//splay(cur->r);
return;
} else cur = cur->r;
}
}
}
//...
};
int main() {
Tree t = Tree();
t.insert(1);
t.insert(5);
return 0;
}
首先,我在树中插入一个值为1的节点;由于没有根,树将其根分配为值为1的新节点。然后,当我把5插入树时,奇怪的事情发生了。如果您保持代码原样(保留第一个cout),那么它将为x打印1。然而,如果您注释掉第一个cout并返回并取消注释第二个cout并返回,您将发现它为x打印出一个随机的垃圾数字,即使没有进行任何修改。谁能告诉我怎么了?
c++不自动初始化类成员。
struct Node {
Node* l, *r, *p;
int v;
Node() {}
Node(int _v, Node* _p) : v(_v), p(_p) {}
};
当您在代码中创建一个新节点时,c++为该节点分配一块内存,但它不会清除它。所以l r &的值;P等于这里的值
在你的算法测试:if (!cur->r)
&(!cur->l)
当前失败,因为在节点中有未初始化的垃圾,而不是NULL
。
因此,当你试图插入第二个节点时,算法认为在根的右边有一个有效节点。然后试着读取这里的内存和这里的值,也就是垃圾x。根据垃圾的值,对于一些运行代码的人来说,它也可能崩溃:)
我也99.9%肯定Node* cur
应该是指向树中节点的指针,而不是新节点:Node* cur = new Node(); cur->v = root->v;
是错误的,应该是Node* cur = root;
正确初始化-在c++11中,你可以这样做:
struct Node {
Node* l = nullptr;
Node *r = nullptr;
Node *p = nullptr;
int v = 0;
Node() {}
Node(int _v, Node* _p) : v(_v), p(_p) {}
};
否则struct Node {
Node* l;
Node *r;
Node *p;
int v;
Node() : l(NULL), r(NULL), p(NULL), v(0){}
Node(int _v, Node* _p) : l(NULL), r(NULL), p(_p), v(_v) {}
};
你应该按照类的定义顺序初始化成员。
现在代码中有很多其他的问题:
unique_ptr
的l和r和根节点)std::unique_ptr
来设置左和右,就会消失)相关文章:
- 对象指针在c++中是如何工作的
- 将返回值存储在函数指针数组的指针中是如何工作的?
- 为什么指针在对二维数组进行排序时无法正常工作?
- 为什么 C 样式字符串的工作空指针检查不?
- 像自定义类一样构造的指针(内置类型)如何工作?
- 为什么通过定义另一个指针单元格,整个代码停止工作?
- 在不工作的情况下为数组分配指针,但反过来也可以
- std::function是如何使指向成员函数的指针工作的
- 为什么运算符"new"需要指针才能工作?
- 当删除 [] 指针工作时,为什么无法获得指向的数组大小?
- For 循环使用指针遍历数组无法正常工作
- 指向C++中成员的指针如何在内部工作?
- 我可以更改将引用参数传递到指针中并使其正常工作的函数的输入(C、C++)吗?
- C++指向成员的指针的类内初始化会使 MSVC 失败(但 GCC/Clang 工作)
- 你不能在 void 指针上使用指针算法,那么 void 指针数组是如何工作的呢?
- 指向成员函数的指针如何工作
- 返回指针的语句 - 解释它是如何工作的以及为什么
- 指向成员结构的指针如何工作
- Malloc,免费和多个指针,它是如何工作的
- 函数指针仅在 main 内部工作