我正在尝试使用字符串创建一个链接列表作为每个节点内的值,但每次我尝试调用应该向列表添加内容的函数时,它最终会给我一个分段错误错误。
这是我的代码:
#include <iostream>
#include <vector>
#include <string>
#include <fstream>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
struct node
{
string data;
struct node *next;
}*head,*var,*trav;
void add(string value)
{
struct node *temp;
temp=head;
var=(struct node *)malloc(sizeof (struct node));
var->data = value;
if(head==NULL)
{
head=var;
head->next=NULL;
}
else
{
while(temp->next!=NULL)
{
temp=temp->next;
}
var->next=NULL;
temp->next=var;
}
}
int main(int argc, char const *argv[])
{
add("hello");
return 0;
}
似乎问题出现在var->data = value;
中,但究竟是什么导致了这个问题呢?我怎么能解决这个问题?
这是出现的错误:
/bin/bash: line 1: 13056 Segmentation fault (core dumped)
答案 0 :(得分:4)
malloc()
不调用std::string data
的构造函数,它只是一个C函数,它分配一个指定大小的块内存,内容是随机垃圾。
因此,当您随后分配给字符串时,它不仅像普通变量那样设置值 - 它调用函数std::string::operator=
,它试图先释放任何先前的内容,但这不正确,它崩溃。
您需要使用C ++运算符new
来创建节点,如下所示:
var = new node;
如你所见,你也不再需要丑陋的演员了。
答案 1 :(得分:-1)
我会说你忘了将head初始化为NULL