隔离了一个段错误 - 但为什么会发生?

时间:2011-05-13 09:47:42

标签: c++ segmentation-fault

使用DevC ++调试器(还是新手),我很确定我已经隔离了一个段错误的情况,但我不知道它为什么会发生。

void LinkedList::Add(const char *Word){
    ListNode *newNode = new ListNode;
    strcpy(newNode->Word, Word);
    newNode->Next = NULL;
    ...
}

在“newNode-> Next = NULL;”处发生段错误。但是,如果我删除其上方的strcpy,则不会发生段错误(但这意味着我的newNode-> Word为空)

编辑:抱歉,伙计们,这里是ListNode:

struct ListNode
{
    char *Word;
    LNodePtr Next;
};

4 个答案:

答案 0 :(得分:4)

如果Word成员是指针,则strcpy将覆盖未分配的内存。

之后,大多数操作都会失败。

使用std::string代替const char*可以在很多地方为您节省时间。

答案 1 :(得分:1)

strcpy很好但很危险,它会复制你的字符,直到它达到\0。如果您的Word不包含任何\ 0,它会将大量内容复制到您newNode->Word指针中。

另一个潜在的危险是初始化newNode->Word的方式,你是否分配了足够的空间来制作字符串副本?

答案 2 :(得分:1)

您尚未在Word结构中为ListNode指针分配任何内存。如果没有这个,它指向一些随机位置,每当您尝试写入该位置时(使用strcpy),您将获得访问冲突。解决这个问题的最简单方法是使用std::string类并摆脱所有手动内存管理。

如果你真的想使用char*,那么为ListNode编写一个带const char*参数的构造函数(记得把它声明为explicit)并使用{ {1}}查找输入字符串的长度。然后为{NULL}终止符分配strlen(额外一个len + 1)并将地址存储在char指针中。之后,您可以Word

答案 3 :(得分:0)

在那里猜测..我在你的ListNode实现中有{},Wordchar*,而且它没有被初始化为指向有效的内存块(可能为null) - strcpy()不会自动分配空间,它假定目的地有足够的空间。在这里,它试图将字符串复制到空指针(或未初始化的指针) - 因此segfault ......