c++ - 结构指针相互覆盖
问题描述
我有一个功能:
void initGraph(node_t *node, const int orderedInputNodes[]) {
int index;
for (int i = 0; i < S * 2; i++) {
if (orderedInputNodes[i] == node->number) {
index = i % 2 == 0 ? i + 1 : i - 1;
node_t newNode;
newNode.number = orderedInputNodes[index];
newNode.left = EMPTY;
newNode.right = EMPTY;
if (node->left == EMPTY) {
node->left = &newNode;
}
else if (node->right == EMPTY) {
node->right = &newNode;
}
}
}
.
.
.
}
每次我找到我创建的相应数字newNode
时,将其值分配给它并将其传递给左侧或右侧,但是,当代码到达分配右孩子的部分时,左孩子会被覆盖。怎么会这样?我想通过声明node_t newNode;
一个全新的节点将自动创建。
解决方案
我想通过声明 node_t newNode; 将自动创建一个全新的节点。
正确的。问题是新节点可以替换旧节点。考虑:
for (int j = 0; j < 1000; ++j)
{
int i;
i = 3;
}
您不会认为在此循环运行后,仍有一千个实例i
仍然存在,是吗?每次运行这段代码时,i
都会创建一个新代码。但是每次运行这段代码时,i
上一次迭代中的那个就不再存在了,因为它超出了范围。
你有:
{
node_t newNode; // newNode is created here
newNode.number = orderedInputNodes[index];
newNode.left = EMPTY;
newNode.right = EMPTY;
if (node->left == EMPTY) {
node->left = &newNode; // you save a pointer to it here
}
else if (node->right == EMPTY) {
node->right = &newNode;
}
}
// but newNode doesn't exist anymore here
所以你保存了一个指向不再存在的对象的指针。它最终指向存储在该内存中的任何内容,可能newNode
是在循环中的下一次通过时创建的下一个。
不要存储指向本地对象的指针。
更新:您说您正在使用 C++ 进行编码。那你为什么要使用原始指针呢?您真的要手动管理对象的生命周期吗?C++ 有很棒的工具可以让这变得简单,比如std::unique_ptr
.
推荐阅读
- python-3.x - Pandas Dataframe 的操作数无法与形状一起广播
- html - 在 Visual Studio 中链接网页
- python - 随时随地创建目录和复制文件,python 相当于 bash 中的 cp -n
- python - 我的神经网络上的权重没有更新(Pytorch)
- python - 使用setStyleSheet时在PyQt5中更改QMessageBox的按钮字体?
- azure - 当我尝试使用增量静态生成部署 nextjs ssg 应用程序时出现 500 错误
- javascript - Vimeo 视频不适用于移动设备
- python - Python-如何将数据帧发送到外部 API(推送)
- c# - 在c#中的现有csv文件中添加新列
- python - TypeError: __init__() 在创建 aiopg 池时需要 5 个位置参数错误