c - 未知的 valgrind 错误 C

标签 c malloc valgrind strcmp

我在 valgrind 和 C 方面遇到了麻烦。我不知道为什么,但 valgrind 是这么说的:

==18241== Invalid read of size 1

==18241== at 0x4C31A64: strcmp (vg_replace_strmem.c:846)

==18241== by 0x403110: lastLetters (diccionario.c:1330)

==18241== Address 0x520c5b3 is 0 bytes after a block of size 3 alloc'd

==18241== at 0x4C2DBF6: malloc (vg_replace_malloc.c:299)

==18241== by 0x402ED0: lastLetters (diccionario.c:1284)

我有一个带有链表的动态矩阵,其中每行都是一个字母,每列都是一个单词。在列表的节点中,有一些我想要在它们之间进行比较的单词,但只需比较每个单词的最后 3 个字母即可。

矩阵示例:

Black Blue Blondie BlackOut

Green Grey

Water

Crimsom Color Clue

例如 Blue 和 Clue 的最后 3 个字母相同:lue。

这是我的代码,valgrind 说:

第 1284 行 => lastLettersList = malloc(sizeof(char)*3);

第 1330 行 => if (strcmp(lastLettersList,lastLettersList2) == 0)

char* lastLettersList;
char* lastLettersList2;
int wordLen = 0;
int maxCount = 0;
int count = 0;

for (int i = 0; i < matrixSpanish->rows; ++i)
{
    node* current = matrixSpanish->list[i]->start;
    while(current!=NULL)
    {
        wordLen = strlen(current->word); 
        count = 0;
        if( wordLen > 2)
        {
            lastLettersList = malloc(sizeof(char)*3);
            lastLettersList[2] = current->word[wordLen-1];
            lastLettersList[1] = current->word[wordLen-2];
            lastLettersList[0] = current->word[wordLen-3];
        }
    }

    for (int j = 0; j < matrixSpanish->rows; ++j)
    {
        node* current2 = matrixSpanish->list[j]->start;             
        while(current2!=NULL)
        {
            wordLen = strlen(current2->word); 
            if( wordLen > 2)
            {
                lastLettersList2 = malloc(sizeof(char)*3);
                lastLettersList2[2] = current2->word[wordLen-1];
                lastLettersList2[1] = current2->word[wordLen-2];
                lastLettersList2[0] = current2->word[wordLen-3];
            }

            if (strcmp(lastLettersList,lastLettersList2) == 0)
            {
                count++;
            }   

            current2=current2->nextNode;
        }
    }    
    current=current->nextNode;
}

最佳答案

您没有为要复制的子字符串分配足够的空间。 lastLettersList 不包含终止空字节(也没有为其分配空间),因此从技术上讲,它不是字符串,而是字符数组。

然后,您尝试在 lastLettersList 上使用字符串函数 strcmp(它不是字符串),然后读取数组的末尾,这就是 Valgrind 的用途警告关于。读取超出数组末尾的内容会调用未定义的行为。

lastLettersList分配一个额外的字节,并将空字节放在末尾。

lastLettersList = malloc(sizeof(char)*4);
lastLettersList[3] = 0;
lastLettersList[2] = current->word[wordLen-1];
lastLettersList[1] = current->word[wordLen-2];
lastLettersList[0] = current->word[wordLen-3];

关于c - 未知的 valgrind 错误 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47604213/

相关文章:

c - 使用 Libgcrypt 的程序中的内存泄漏

c - 使用递归函数在数组中搜索值

c - 如何为其他语言(word2vec)制作预训练 vector ?

c++ - 为什么 `std::time` 有一个不必要的参数?

c - C 中结构的 Malloc

malloc - 使用jemalloc,malloc,calloc和其他常见替代方法的优缺点是什么?

c - Valgrind: stdio.h 的函数 "puts"分配内存

python - 在 valgrind 下运行 python 显示很多内存错误是否正常?

c - 玩转字符串函数

c free()函数问题