【问题标题】:Memory allocation failure while constructing a node构建节点时内存分配失败
【发布时间】:2012-02-24 17:14:20
【问题描述】:

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

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 分配一些内存空间时,我在运行时收到“分段错误”。

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

我怎样才能在不引起任何内存泄漏的情况下克服这个问题?

【问题讨论】:

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


    【解决方案1】:

    您必须检查strlen(tok) 是否为正。否则,您将尝试分配 0 个字节。 malloc 反过来返回 NULL 以指示成功分配 0 字节。之后,您取消引用 NULL 指针并崩溃。至于如何克服这个问题,嗯......你必须要么支持p_word为空,要么分配strlen(tok) + 1字节,例如,只为空字符串存储\0

    【讨论】:

      【解决方案2】:

      问题可能出在 strtok..检查“tok”并查看它是否以 NULL 终止。 strlen 不适用于非空终止字符。另外,请注意 strtok 在标记化过程中修改字符串。建议在开始循环之前将字符串复制到临时缓冲区中。请看看这个 strtok problem in calling

      【讨论】:

        【解决方案3】:
        1. 验证 fgets 返回的是否为非 NULL。如果它返回 NULL,则缓冲区可能不会以 '\0' 终止。
        2. 验证“curr = (lpnode)malloc(sizeof(node));”的类型是否正确。它是哪种类型?我会期待“结构树节点”。
        3. 字符串大小为 strlen(tok) + 1!也没有理由乘以定义为 1 的 sizeof(char)。
        4. 验证 malloc 返回一个有效的内存块

        【讨论】:

          【解决方案4】:

          检查tok 是一个正确的字符串,检查strlen(tok) 既不是负数也不是大得离谱(可以通过之前的测试暗示)并且malloc 实际上返回了一些内存(不能替代这个测试)。


          试试这个

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

          【讨论】:

          • 其实tok是正确的,strlen(tok)总是返回非空终止tok的长度。我尝试了另一种分配方式,将 255 作为参数改为;所以没有使用tok进行分配但是问题仍然存在。
          【解决方案5】:

          啊终于解决了;问题出在插入函数内部。我发现我一直在尝试将整数参数转换为 char 指针。这是调试失败,真丢人:)无论如何,谢谢大家。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2013-06-16
            • 2019-02-26
            • 2016-05-01
            • 2013-02-19
            • 2011-12-12
            • 2011-08-23
            相关资源
            最近更新 更多