希望可以帮助我解决这个问题。 我正在使用包含单词列表的.txt。我阅读了所有单词,并将它们放入一个名为StopWords的结构中。 我的问题是,当我使用valgrind时,它会在strtok行中出错。
==11976== Invalid write of size 8
==11976== at 0x4027FC: loadStopWords (functions.c:735)
==11976== by 0x4028D0: main (search.c:23)
==11976== Address 0x52067d8 is 0 bytes after a block of size 2,552 alloc'd
==11976== at 0x4C2DBF6: malloc (vg_replace_malloc.c:299)
==11976== by 0x4026FA: loadStopWords (functions.c:704)
==11976== by 0x4028D0: main (search.c:23)
我真的不知道这里发生了什么。
StopWords* loadStopWords(char* pathStopWordsFile, code *statusCode)
{
StopWords* sWords;
FILE *file;
int size;
char* dataFileChar;
int wordsNumber = 1;
int wordLen = 0;
char*token;
int count = 1;
file = fopen (pathStopWordsFile, "r" );
if (file==NULL)
{
*statusCode = ERR_FILE_NOT_FOUND;
exit(1);
}
else
{
*statusCode = OK;
}
fseek(file,0,SEEK_END);
size = ftell(file);
rewind(file);
dataFileChar = (char*)malloc(sizeof(char)*(size+1));
fread(dataFileChar,sizeof(char), size, file);
dataFileChar[size] = '\0';
fclose(file);
for (int i = 0; i < size ; ++i)
{
if(dataFileChar[i] == '\n')
{
wordsNumber++;
}
}
sWords = (StopWords*)malloc(sizeof(StopWords));
sWords->words = (char**)malloc(sizeof(char*)*wordsNumber);
wordsNumber = 1;
for (int i = 0; i < size; ++i)
{
if(dataFileChar[i] == '\n')
{
wordsNumber++;
sWords->words[wordLen] = (char*)malloc(sizeof(char)*wordLen);
wordLen = 0;
}
else if(dataFileChar[i] != '\n' && dataFileChar[i] != '\r')
{
wordLen++;
}
}
wordLen = 0;
token = strtok(dataFileChar, "\n");
sWords->words[0] = token;
removeInvisibleCharacter(sWords->words[0]);
while( token )
{
token = strtok(NULL, "\n");
sWords->words[count] = token;
removeInvisibleCharacter(sWords->words[count-1]);
count++;
}
sWords->numberOfStopWords = wordsNumber;
free(dataFileChar);
return sWords;
}
我也有节目的主要内容,如果有人需要结构或主要内容,请问我。
答案 0 :(得分:0)
让我给你一些提示:
sWords->words[wordLen] = (char*)malloc(sizeof(char)*wordLen);
使用 words[wordLen]
没有意义。您应该根据当前正在处理的单词的编号进行索引。我认为这是正确的:
sWords->words[wordsNumber++] = (char*)malloc(sizeof(char)*wordLen);
我们使用后缀增量将其值增加一个后将其用作索引,因此您可以删除上一行(wordsNumber++;
)。
由于C数组索引从零开始,请将wordsNumber = 1;
从1)中提到的for
周期之前更改为wordsNumber = 0;
。
removeInvisibleCharacters()
做什么以及源代码是什么(或至少是签名)?
我会在这里添加更多点,因为我可能会发现其他问题。
答案 1 :(得分:0)
您的while
循环构造错误,可能是问题所在。以下是您可以做的更安全的事情:
counter = 0;
....
token = strtok(dataFileChar, "\n");
while( token )
{
sWords->words[count] = token;
/* This function may be a problem on its own, need to see its code.
In your original code, you call it twice for the first token */
removeInvisibleCharacter(sWords->words[count]);
count++;
token = strtok(NULL, "\n");
}