c++ - C++:将指针插入结构的双指针数组时出现分段错误
问题描述
我有一个具有以下定义的 TreeNode 类,其中包含一个指向 TreeNode 指针数组的双指针:
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
typedef struct TreeNode {
int key;
int val;
bool flag;
int num_children;
TreeNode **children;
} TreeNode;
在以下代码中:
TreeNode* node1 = new TreeNode{1, 1, true, 0, NULL};
TreeNode* node2 = new TreeNode{2, 2, true, 0, NULL};
TreeNode* node3 = new TreeNode{3, 2, true, 0, NULL};
TreeNode* node4 = new TreeNode{4, 2, true, 0, NULL};
TreeNode* node5 = new TreeNode{5, 2, true, 0, NULL};
// Assign node2 to be the child of node1
node1->children = &node2;
cout << "Assigned node1->children = &node2;" << endl;
// Assign node3 to be the second child of node1
node1->children[1] = node3;
cout << "Assigned node1->children[1] = node3;" << endl;
node1->children[2] = node4;
cout << "Assigned node1->children[2] = node4;" << endl;
node1->children[3] = node5;
cout << "Assigned node1->children[3] = node3;" << endl;
我在以下代码行中遇到分段错误:
node1->children[2] = node4;
考虑到我使用 new 关键字动态分配内存,这似乎很奇怪。此外,我不能为数组分配固定数量的内存,因为子数组可以在程序中的任何时刻改变大小。
解决方案
node1->children = &node2;
因此,node1->children
包含 的地址node2
。
node1->children[2] = node4;
这没有意义。由于node1->children
包含指向node2
而不是数组的指针,因此node1->children[2]
不存在 - 没有为其分配空间,因此无法设置其值。
您想要一个指针数组,但您没有在任何地方创建任何空间来存储指针数组。
您的代码在概念上与此没有什么不同:
int a;
int *b = &a;
b[1] = 7;
虽然b[0]
指向a
,b[1]
无效,因此不能赋值。如果我们想要一个指向 的指针数组int
,我们需要在某个地方为一个指针腾出空间。必须有一个new int*[2]
地方。
你可能想做一些事情,比如node1->children = new TreeNode*[5];
分配一个由 5 个指针组成的数组到TreeNode
s。然后,一旦您有地方存储指针数组,您就可以设置node->children[0]
为node->children[4]
指向您想要的任何内容。
推荐阅读
- javascript - 为什么 Cytoscape 在这种特定情况下会进入“无限”循环?
- python - 我将如何进行反精灵碰撞?
- java - 如何在spring boot中处理ajax post数据
- javascript - Stage.enter 不启动向导
- asp.net-core - 将 IOptions<> 注入 ApiKeyAuthorizeAttribute
- javascript - 如何使用 javascript 替换 URL 的所有实例(例如在图像的 src 中,或作为网页本身)?
- javascript - 以十六进制发送 Javascript POST XMLHttpRequest 文件内容
- arrays - 如何在数组中查找与mongodb中其他数组值匹配的值
- javascript - 正则表达式匹配 0 到 25 之间的数字,包括 1 精度
- node.js - 无法使用 mongoose 将文档保存到 mongodb