我与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];