현재 CS50x 문제 세트 5, Speller에 대해 작업 중입니다. valgrind를 사용하면 다음 오류가 발생합니다.
==395== Memcheck, a memory error detector
==395== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==395== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==395== Command: ./speller texts/cat.txt
==395==
==395==
==395== Process terminating with default action of signal 11 (SIGSEGV)
==395== Bad permissions for mapped region at address 0x601DE8
==395== at 0x401155: add_Node (dictionary.c:75)
==395== by 0x401239: load (dictionary.c:107)
==395== by 0x400944: main (speller.c:40)
==395==
==395== HEAP SUMMARY:
==395== in use at exit: 5,328,336 bytes in 95,140 blocks
==395== total heap usage: 95,141 allocs, 1 frees, 5,332,432 bytes allocated
==395==
==395== 552 bytes in 1 blocks are still reachable in loss record 1 of 2
==395== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==395== by 0x5258E49: __fopen_internal (iofopen.c:65)
==395== by 0x5258E49: fopen@@GLIBC_2.2.5 (iofopen.c:89)
==395== by 0x4011BE: load (dictionary.c:88)
==395== by 0x400944: main (speller.c:40)
==395==
==395== 5,327,784 bytes in 95,139 blocks are still reachable in loss record 2 of 2
==395== at 0x4C2FB0F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==395== by 0x401118: add_Node (dictionary.c:69)
==395== by 0x401239: load (dictionary.c:107)
==395== by 0x400944: main (speller.c:40)
==395==
==395== LEAK SUMMARY:
==395== definitely lost: 0 bytes in 0 blocks
==395== indirectly lost: 0 bytes in 0 blocks
==395== possibly lost: 0 bytes in 0 blocks
==395== still reachable: 5,328,336 bytes in 95,140 blocks
==395== suppressed: 0 bytes in 0 blocks
==395==
==395== For counts of detected and suppressed errors, rerun with: -v
==395== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Segmentation fault
이것은 load 및 add_Node 함수에 대한 내 코드입니다.
// Loads dictionary into memory, returning true if successful else false
bool load(const char *dictionary)
{
FILE *file = fopen(dictionary, "r");
if (file == NULL)
{
return false;
}
// Set pointers in table to NULL
for (int i = 0; i < N; i++)
{
table[i] = NULL;
}
char word[LENGTH + 1]; //to hold a word from dictionary
while (fgets(word, LENGTH + 1, file) != NULL)
{
int row = hash(word); // to determine where to store the word
add_Node(row, word);
}
fclose(file);
return true;
}
// Adds new node to a list in dictionary
void add_Node(int row, char word[LENGTH + 1])
{
node *newNode = malloc(sizeof(node));
strcpy(newNode->word, word);
if (table[row] == NULL) //if single linked list is empty
{
table[row] = newNode;
}
else
{
node *tmpHead = table[row];
table[row] = newNode;
newNode->next = tmpHead;
}
}
89 행은 다음에 해당합니다.
add_Node(row, word);
105 행은 "table [row] = newNode;"에 해당합니다. 에:
if (table[row] == NULL) //if single linked list is empty
{
table[row] = newNode;
}
table은 노드 유형의 포인터 배열 인 전역 변수입니다. 행이 배열, 테이블의 경계 내에 있는지 이미 확인했습니다. 이 문제를 해결하는 방법을 모르겠습니다. 문제가 무엇일까요?
먼저 읽지 않기 때문에 변경 while (fgets(word, LENGTH + 1, file) != NULL)
을 사용하십시오 .while(fscanf(file, "%s", word) != EOF)
"\n"
귀하의 add_Node
기능이 일부 라인을 누락 일부 변경을 필요로한다 :
낡은:
// Adds new node to a list in dictionary
void add_Node(int row, char word[LENGTH + 1])
{
node *newNode = malloc(sizeof(node));
strcpy(newNode->word, word);
if (table[row] == NULL) //if single linked list is empty
{
table[row] = newNode;
}
else
{
node *tmpHead = table[row];
table[row] = newNode;
newNode->next = tmpHead;
}
}
새로운:
// Adds new node to a list in dictionary
void add_Node(int row, char word[LENGTH + 1])
{
node *newNode = malloc(sizeof(node));
//Test if the node is not empty
if(newNode == NULL){
return 1;
}
strcpy(newNode->word, word);
newNode->next = NULL;
if (table[row] == NULL) //if single linked list is empty
{
table[row] = newNode;
}
else
{ //Set the newNode to table at row and make table[row]
//equal to newNode to overwrite the current address at table[row].
//No need for tmp as we are not swapping things.
newNode -> next = table[row];
table[row] = newNode;
}
}
이것은 당신의 valgrind 문제를 해결할 것입니다. 또한 필요하지 않으므로 tmp 노드가 필요하지 않습니다. 당신이 있는지 확실하지 않다 hash
잘 여부 작동 기능,하지만 난 그 괜찮 가정합니다. 마지막으로, valgrind에 따라 "도달 할 수있는"메모리 누수가 발생 fclose(file)
하므로 load
함수 끝에서 확인하십시오 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다