我已经将二进制堆实现为树,树节点如下;
struct tree_node {
char* p_word;
int count;
struct tree_node* parent;
struct tree_node* p_left;
struct tree_node* p_right;
};
一切都运作良好,直到它成为char *成员。当我尝试为p_word分配一些内存空间时,我在运行时给出了“Segmentation Fault”。
fgets(buffer, BUFFERSIZE, fp);
for(tok = strtok(buffer, " "); tok; tok = strtok(0, " ")) {
if(tok) {
curr = (lpnode)malloc(sizeof(node));
curr->p_left = curr->p_right = NULL;
curr->count = 1;
curr->p_word = (char*)malloc(sizeof(char) * strlen(tok));
strcpy(curr->p_word, tok);
insert(&root, &root, curr);
}
}
fclose(fp);
请注意,curr表示将添加到树中的节点,root表示树的根节点。
如何在不造成任何内存泄漏的情况下克服此问题?
答案 0 :(得分:0)
您必须检查strlen(tok)
是否为正。否则,您将尝试分配0个字节。 malloc
依次返回NULL
以指示成功分配0个字节。之后,您取消引用NULL指针并崩溃。至于如何克服这个问题,那么......你必须支持p_word
为空,或者分配strlen(tok) + 1
个字节,例如,只为空字符串存储\0
。
答案 1 :(得分:0)
问题可能在于strtok ..检查“tok”并查看它是否以NULL结尾。 strlen不适用于非null终止的字符。另请注意,strtok会在标记化过程中修改字符串。建议在开始循环之前将字符串复制到临时缓冲区中。请看看这个 strtok problem in calling
答案 2 :(得分:0)
检查tok
是否是正确的字符串,检查strlen(tok)
是否为负面或非常大(可以通过之前的测试暗示)并malloc
实际返回一些内存(无替代品)对于这个测试)。
试试这个
curr->p_word = (char*)malloc(sizeof(char) * (strlen(tok)+1));
strcpy(curr->p_word, tok);
答案 3 :(得分:0)
答案 4 :(得分:0)
啊,最后我解决了它;问题出在插入函数内部。我发现我一直在尝试将整数参数转换为char指针。这是调试失败,对我很遗憾:)无论如何,谢谢大家。