strtok和valgrind泄漏c

时间:2017-09-10 05:24:19

标签: c valgrind strtok

希望可以帮助我解决这个问题。 我正在使用包含单词列表的.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;
}

我也有节目的主要内容,如果有人需要结构或主要内容,请问我。

2 个答案:

答案 0 :(得分:0)

让我给你一些提示:

1)

sWords->words[wordLen] = (char*)malloc(sizeof(char)*wordLen);

使用 words[wordLen] 没有意义。您应该根据当前正在处理的单词的编号进行索引。我认为这是正确的:

sWords->words[wordsNumber++] = (char*)malloc(sizeof(char)*wordLen);

我们使用后缀增量将其值增加一个将其用作索引,因此您可以删除上一行(wordsNumber++;)。

2)

由于C数组索引从零开始,请将wordsNumber = 1;从1)中提到的for周期之前更改为wordsNumber = 0;

3)

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");
}