构造节点时内存分配失败

时间:2012-02-24 17:14:20

标签: c string memory-management segmentation-fault malloc

我已经将二进制堆实现为树,树节点如下;

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

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

5 个答案:

答案 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)

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

答案 4 :(得分:0)

啊,最后我解决了它;问题出在插入函数内部。我发现我一直在尝试将整数参数转换为char指针。这是调试失败,对我很遗憾:)无论如何,谢谢大家。