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


  == 18241 ==读取的大小为1无效
  
  == 18241 == at 0x4C31A64:strcmp(vg_replace_strmem.c:846)
  
  == 18241 ==通过0x403110:lastLetters(diccionario.c:1330)
  
  == 18241 ==地址0x520c5b3在分配了大小为3的块后为0字节
  
  == 18241 ==在0x4C2DBF6:malloc(vg_replace_malloc.c:299)
  
  == 18241 ==通过0x402ED0:lastLetters(diccionario.c:1284)


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

矩阵示例:


  黑色蓝色金发女郎停电
  
  绿灰
  
  水
  
  犯罪色彩线索


例如,Blue&Clue的后三个字母相同: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不包含终止的空字节(您也没有为其分配空间),因此从技术上讲,它不是字符串,而是字符数组。

然后,尝试在strcmp上使用字符串函数lastLettersList,它不是字符串,然后读取数组的末尾,这是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/

10-11 15:32