未知的 valgrind 错误 C
unknown valgrind errors C
我在使用 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 行 => 如果 (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;
}
您没有为要复制的子字符串分配足够的 space。 lastLettersList
不包含终止空字节(您也没有为其分配 space),因此从技术上讲它不是字符串而是字符数组。
然后您尝试在 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];
我在使用 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 行 => 如果 (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;
}
您没有为要复制的子字符串分配足够的 space。 lastLettersList
不包含终止空字节(您也没有为其分配 space),因此从技术上讲它不是字符串而是字符数组。
然后您尝试在 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];