cs50 pset5卸载问题-内存泄漏

时间:2018-09-05 13:52:29

标签: c cs50

我正在尝试解决cs50 pset5。我正在使用trys方法。

我可以成功地在尝试中插入单词。但是,当我卸载内存时,它将失败。我在卸载问题上呆了几天。

当我尝试卸载功能时,它指出Erorr消息:两次释放或损坏(!prev):0x000000000205d010 ***

这可能是由于我的卸载功能引起的,但是我已经画出了逻辑。对我来说似乎很好。任何人都知道在哪里修改?

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <string.h>
#include <ctype.h>

#define LENGTH 45
#define SIZE_OF_CHILD 27

typedef struct Node {
    bool is_word;
    struct Node* child[SIZE_OF_CHILD];
} Node;


Node* root;
Node* temp;

Node* create_node(Node* node);
void test();
int cal_key(char c);
Node* insert(const char* word);
void unload(Node* node);

int main() {
    root = malloc(sizeof(Node));
    if (root == NULL) {
        exit(0);
    }

    root = create_node(root);
    temp = malloc(sizeof(Node));
        if (temp == NULL) {
        exit(0);
    }

    test();

}

// **************** function to create a node *******************
Node* create_node(Node* node) {
    node->is_word = false;
    for (int i = 0; i < SIZE_OF_CHILD; i++) {
        node->child[i] = NULL;
    }
    return node; 
}

//************* calculate the key value ************
// Assume that the input is in lower case
int cal_key(char c) {
    if (isalpha(c)) {
        if (islower(c)) {
             return c - 'a';
        }
        else {
            return c + 32 -'a';
        }
    }
    else {
        return SIZE_OF_CHILD - 1;
    }
}

//*************** function to insert an item in the the node ***********
Node* insert(const char* word) {
    int str_len = strlen(word);
    temp = root;
    int key;
    for (int i = 0; i < str_len; i++) {
        key = cal_key(word[i]);
        if (temp->child[key] == NULL) {
            Node* node = malloc(sizeof(Node));  
            if (node == NULL) {
                fprintf(stderr, "Error in creating node\n");
                exit(0);
            }
            node = create_node(node);
            temp->child[key] = node;
        }

        temp = temp->child[key];
    }
    temp->is_word = true;
    return root;
}


//***************** function to unload a function ********************
void unload(Node* node) {
    // This is to find the last node
    for (int i = 0; i < SIZE_OF_CHILD; i++) {
        if (node->child[i] != NULL) {
            unload(node->child[i]);
        }
    free(node);
    }
}

void test() {
    root = insert("Peter");
    unload(root);
    }

0 个答案:

没有答案