free()一个char **数组

时间:2016-11-17 13:25:24

标签: c arrays pointers free

我有这个:

struct Library {
    char letter;
    int capacity;
    int size;
    char** words;
};
typedef struct Library Lib;

初始化Library的数组:

void InitLibrary(Program* startup) {
    char alphabet[26] = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
    startup->dictionary = malloc(sizeof(Lib) * 26);
    int i;
    for (i = 0; i < 26; i++) {
        startup->dictionary[i].letter = alphabet[i];
        startup->dictionary[i].capacity = INIT_CAPACITY;
        startup->dictionary[i].size = 0;
        startup->dictionary[i].words = malloc(sizeof(char*) * startup->dictionary[i].capacity);
    }
}

这里我填充数组words

void FillDicoFromFile(Program* startup){
    while((!feof(startup->f) && !ferror(startup->f))){
        char* word = malloc(sizeof(char) * 30);
        fscanf(startup->f, "%s", word);
        ToLowerCase(word);
        int indexLib = word[0] - 97;
        int sizeLib = startup->dictionary[indexLib].size;
        startup->dictionary[indexLib].words[sizeLib] = word;
        startup->dictionary[indexLib].size++;
    }
    CountTotalWords(startup);
    rewind(startup->f);
}

和这样的函数:

void CleanDico(Program* startup){
    int i = 0;
    for(; i < startup->dictionary[i].size; i++){
        int j = 0;
        for(; j < startup->dictionary[i].size; i++){
            free(startup->dictionary[i].words[j]);
            startup->dictionary[i].words[j] = NULL;
        }
        startup->dictionary[i].size = 0;
    }
    startup->totalWords = 0;
}

我在我的struct上获得了数组的大小以获取我的数组的限制,并释放所有使用过的单元格,但每次调用CleanDico时,代码都会崩溃。有什么建议?

我已经问过a question on a problem with a char array了。现在我想free()数组。我已经在这里和那里阅读了很多帖子并测试了很多解决方案,但没有人帮助我解决我的问题。

我在CleanDico上获得了一个SEGMENTATION_FAULT,我没有关于该错误的任何其他信息。 Code :: Blocks上的调试模式很差,错误消息。

3 个答案:

答案 0 :(得分:4)

我认为你的第二个意思是

for(; j < startup->dictionary[j].size; j++){

而不是

for(; i < startup->dictionary[i].size; i++){

答案 1 :(得分:2)

每个malloc()calloc()realloc()必须与对应的free()(或realloc())匹配。

你有这个:

startup->dictionary[i].words = malloc(sizeof(char*) * N);

它为您提供了一个未初始化的指针数组(它们包含垃圾)。

后来你有了这个:

free(startup->dictionary[i].words[j]);

哪个解除分配您从未初始化的指针。并且无法解除分配的内容。

顺便说一下,您可能希望考虑一个不同的数据结构:分配一个包含所有单词的char数组,加上一个char*数组,其中包含一个指向每个单词的指针。这样,您总是只有两个分配和解除分配(除非您不知道所有单词的最大大小,在这种情况下,您可能偶尔需要realloc())。

答案 2 :(得分:1)

你的内部for循环也会增加i变量。所以它超出了索引。

编辑:外部循环应该运行26次,因为你有26个字母。

for(; i < 26; i++){
    int j = 0;
    for(; j < startup->dictionary[i].size; j++){
        free(startup->dictionary[i].words[j]);
        startup->dictionary[i].words[j] = NULL;
    }
    startup->dictionary[i].size = 0;
}