希望能帮我解决这个问题。 我正在使用一个包含单词列表的 .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;
}
我也有程序的main,如果有人需要struct或main,请问我。
最佳答案
让我给你几个提示:
1)
sWords->words[wordLen] = (char*)malloc(sizeof(char)*wordLen);
使用words[wordLen]
没有意义。您应该按当前正在处理的单词数进行索引。我认为这是正确的:
sWords->words[wordsNumber++] = (char*)malloc(sizeof(char)*wordLen);
我们使用后缀增量将其值在用作索引后增加一个,因此您可以删除前一行 (wordsNumber++;
)。
2)
由于 C 数组索引是从零开始的,因此将 1) 中提到的 for
循环之前的 wordsNumber = 1;
更改为 wordsNumber = 0;
.
3)
removeInvisibleCharacters()
的作用是什么?源代码(或至少签名)是什么?
我会在这里添加更多要点,因为我可能会发现其他问题。
关于c - strtok 和 valgrind 泄漏 c,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46137560/