c - strtok 和 valgrind 泄漏 c

标签 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;
}

我也有程序的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/

相关文章:

c - C语言中的无限while循环1

c - 我的树程序在插入一个根节点后崩溃

c - 反向打印链表

c++ - 在 C++ 中对 unordered_map 使用 getter 会创建大小为 8 的无效读取

C strtok 正在创建大小为 1 的无效读取,无法释放( token )

c - 将函数中的 token (strtok)存储在主数组中

c - 如何复制存储在 strtok() token 中的字符串?

c - 警告 : assignment makes pointer from integer without a cast [enabled by default]

c - 为什么这个简单的程序给出 "bus error"?

C++ 程序在执行 std::string 分配时总是崩溃