目前我有一个研究项目,我和一个朋友真的不知道如何解决这个问题。
所以,这是一个C项目。我有2个结构:
struct Lib {
char letter;
int capacity;
int size;
char** words[200000];
};
typedef struct Lib Library;
struct Program {
char* loadedFileName[50];
FILE* f;
Library* dictionary;
int totalwords;
};
typedef struct Program Program;
这个功能:
void fillDicoFromFile(Program* startup){
rewind(startup->f);
while(!feof(startup->f) && !ferror(startup->f)){
char* word = malloc(sizeof(char) * 30);
fscanf(startup->f, "%s", word);
int indexLib = word[0] - 97;
int sizeLib = startup->dictionary[indexLib].size;
startup->dictionary[indexLib].words[sizeLib] = (char*)malloc(sizeof(char) * (strlen(word)+1));
startup->dictionary[indexLib].words[sizeLib] = word;
startup->dictionary[indexLib].size++;
free(word);
}
CountTotalWords(startup);
}
startup->字典是一个26库的数组,当我从文件中得到一个单词时,我检查他的第一个字母并选择好的库(startup->字典[0]为'a'.. 。)然后将这个单词放在结构的数组“单词”上,但是当我想要printf一些单词时,它就会出现错误的字符串错误。我很确定我们在指针上做错了但是......
我们做错了什么?
答案 0 :(得分:0)
此:
startup->dictionary[indexLib].words[sizeLib] = (char*)malloc(sizeof(char) * (strlen(word)+1));
startup->dictionary[indexLib].words[sizeLib] = word;
......没有做你认为的事情。你正在分配空间(使用malloc
,第一行),但你没有使用它;相反,您正在word
(第二行)存储指向先前分配的空间的指针。要清楚,语句startup->dictionary[indexLib].words[sizeLib] = word
不会复制字符串;它只是指定一个指针。
然后,你释放那个空间:
free(word);
字典现在包含悬空指针 - 指向不再分配的区域的指针。修复很简单:
malloc
);您不需要为已经为free(word)
行;你不想释放这个空间,因为它被字典结构引用。