C++:将指针插入结构的双指针数组时出现分段错误
C++: Segmentation fault when inserting pointer into a struct's double pointer array
我有一个具有以下定义的 TreeNode class,包含一个指向 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]
不存在——没有为它分配 space,因此它的值不能是设置。
你想要一个指针数组,但你没有在任何地方创建任何 space 来存储指针数组。
您的代码在概念上与此没有区别:
int a;
int *b = &a;
b[1] = 7;
虽然 b[0]
指向 a
,但 b[1]
无效,因此无法赋值。如果我们想要一个指向 int
的指针数组,我们需要在某个地方创建 space 。某处必须有一个new int*[2]
。
您可能想做类似 node1->children = new TreeNode*[5];
的事情来分配一个包含 5 个指向 TreeNode
的指针的数组。然后你可以设置 node->children[0]
到 node->children[4]
来指向你想要的任何东西,一旦你有一个地方来存储指针数组。
我有一个具有以下定义的 TreeNode class,包含一个指向 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]
不存在——没有为它分配 space,因此它的值不能是设置。
你想要一个指针数组,但你没有在任何地方创建任何 space 来存储指针数组。
您的代码在概念上与此没有区别:
int a;
int *b = &a;
b[1] = 7;
虽然 b[0]
指向 a
,但 b[1]
无效,因此无法赋值。如果我们想要一个指向 int
的指针数组,我们需要在某个地方创建 space 。某处必须有一个new int*[2]
。
您可能想做类似 node1->children = new TreeNode*[5];
的事情来分配一个包含 5 个指向 TreeNode
的指针的数组。然后你可以设置 node->children[0]
到 node->children[4]
来指向你想要的任何东西,一旦你有一个地方来存储指针数组。