free() 一个字符数组**

free() an array of char**

我有这个:

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

初始化库数组:

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;
}

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

我已经问过了。现在我想要 free() 数组。我在这里和那里阅读了大量帖子并测试了很多解决方案,但 none 帮助我解决了我的问题。

我在 CleanDico 上收到 SEGMENTATION_FAULT,但我没有关于该错误的任何其他信息。 Code::Blocks 上的调试 mod 错误消息很差。

我想你的第二个是你想做的事

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

而不是

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

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

你有这个:

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

它给你一个指针数组,未初始化(它们包含垃圾)。

稍后你有这个:

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

取消分配您从未初始化的指针。并且未能取消分配您分配的内容。

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

您的内部 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;
}