c-构造节点时内存分配失败



我已经实现了一个二进制堆作为树,树节点如下;

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表示树的根节点。

如何在不造成任何内存泄漏的情况下解决此问题?

您必须检查strlen(tok)是否为阳性。否则,您将尝试分配0个字节。CCD_ 2又返回CCD_ 3以指示0字节的成功分配。之后,您可以取消引用NULL指针并崩溃。至于如何克服这一点,嗯。。。您必须支持p_word为null,或者分配strlen(tok) + 1字节,以便仅为空字符串存储

问题可能出在strtok上。。检查"tok",看看它是否以NULL结尾。strlen不适用于非null终止的字符。另外,请注意strtok在标记化过程中会修改字符串。建议在开始循环之前将字符串复制到临时缓冲区中。请看一下这个调用时的strtok问题

  1. 请验证fgets返回的值是否为非NULL。如果返回NULL,则缓冲区可能不会以"\0"终止
  2. 验证"curr=(lpnode)malloc(sizeof(node));"的类型是否正确。它是哪种类型的?我本应该是"struct-tree_node"
  3. 字符串大小为strlen(tok)+1!也没有理由乘以定义为1的sizeof(char)
  4. 验证malloc是否返回有效的内存块

检查tok是否是一个正确的字符串,检查strlen(tok)是否为负值或无穷大(可以由以前的测试暗示),以及malloc是否实际返回了一些内存(不能替代此测试)。


试试这个

curr->p_word = (char*)malloc(sizeof(char) * (strlen(tok)+1));
strcpy(curr->p_word, tok);

啊终于解决了;问题出在insert函数内部。我发现我一直在尝试将integer参数转换为char指针。这是一次调试失败,我很惭愧:)不管怎样,谢谢大家。

相关内容

  • 没有找到相关文章

最新更新