使用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;
};
答案 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
实现中有{},Word
是char*
,而且它没有被初始化为指向有效的内存块(可能为null) - strcpy()
不会自动分配空间,它假定目的地有足够的空间。在这里,它试图将字符串复制到空指针(或未初始化的指针) - 因此segfault ......