我有这个:
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上的调试模式很差,错误消息。
答案 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;
}