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;
}
我有这个:
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;
}