【发布时间】:2019-08-30 03:02:35
【问题描述】:
我正在尝试学习如何使用 gdb 调试器来修复此示例代码。单步执行调试器时,我可以看到“mylist[i]->val = i;”这一行正在引发分段错误。
我想我明白什么是分段错误,但我不明白这条线是如何导致它的。我需要为 mylist 向量分配内存吗?我该怎么做?我以为向量已经在 main() 中初始化并准备好了,但我不太确定。
我尝试对 mylist 向量中的每个节点使用“new”,但这给了我一个编译错误。
node* mylist[i] = new node; //what I tried
mylist[i]->val = i;
mylist[i]->next = NULL;
//error message
error: array must be initialized with a brace-enclosed initializer
node* mylist[i] = new node;
我的代码
class node
{
public:
int val;
node* next;
};
void create_LL(vector<node*>& mylist, int node_num)
{
mylist.assign(node_num, NULL);
//create a set of nodes
for (int i = 0; i < node_num; i++)
{
mylist[i]->val = i; //error happens here
mylist[i]->next = NULL;
}
... (relevant section of main() below)
int main(int argc, char ** argv)
{
const int NODE_NUM = 3;
vector<node*> mylist;
create_LL(mylist, NODE_NUM);
显示的实际错误是“Segmentation fault (core dumped)”
当我在它显示的错误行之前打印 mylist 时
$1 = std::vector of length 3, capacity 3 = {0x0, 0x0, 0x0}
我还在学习 c++,所以我可能会遗漏一些非常基本的东西。 我真的很感激任何帮助。谢谢!
【问题讨论】:
-
您需要为节点分配内存。您只是在向量中添加了一堆空指针。如果您在分配内存时遇到问题,最好将该尝试与完整的错误消息一起发布。还不清楚您要尝试做什么。链表节点的向量有点奇怪。
-
我想我不明白如何为节点分配内存。我尝试添加这个“node* mylist[i] = new node;”在错误线上方,但我得到数组必须初始化错误
-
你在哪里填充向量?
-
向量永远不会被填充,它在 main() 中初始化,然后立即在 create_LL() 中调用。它应该只包含 3 个节点,其键分配给 i (0, 1, 2)
-
初始化向量为
vector<node*> mylist(NODE_NUM, new node())
标签: c++ vector linked-list segmentation-fault