未知的阀门错误C



我与Valgrind和C遇到了麻烦。我不知道为什么,但是Valgrind这么说:

== 18241 ==尺寸1

的无效读取

== 18241 ==在0x4c31a64:strcmp(vg_replace_strmem.c:846)

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

== 18241 ==地址0x520c5b3为0字节,大小为3 Alloc'd

== 18241 ==在0x4c2dbf6:malloc(vg_replace_malloc.c:299)

== 18241 == by 0x402ed0:lastletters(diccionario.c:1284)

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

矩阵的示例:

黑色蓝色金发碧眼

绿色灰色

crimsom颜色线索

例如蓝色&线索有同样的最后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不包含终止null字节(您也不为其分配空间),因此从技术上讲,它不是字符串,而是字符数组。

然后,您尝试使用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];

相关内容

  • 没有找到相关文章

最新更新