My speller programs compile and run with no issues however valgrind doesn't seem to think so. I initially used malloc and manually initialised each pointer to null and the boolean to false. I have since switched to calloc and i'm still getting the same errors. This is valgrind's output:
==16497== Memcheck, a memory error detector
==16497== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al.
==16497== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info
==16497== Command: ./speller /home/cs50/pset5/texts/quote.txt
==16497== Parent PID: 3464
==16497==
==16497== Invalid read of size 4
==16497== at 0x80490AC: load (dictionary.c:78)
==16497== by 0x8048725: main (speller.c:45)
==16497== Address 0x71f4fe8 is not stack'd, malloc'd or (recently) free'd
==16497==
==16497== Invalid write of size 4
==16497== at 0x80490E4: load (dictionary.c:80)
==16497== by 0x8048725: main (speller.c:45)
==16497== Address 0x71f4fe8 is not stack'd, malloc'd or (recently) free'd
==16497==
==16497== Invalid read of size 4
==16497== at 0x80490EE: load (dictionary.c:83)
==16497== by 0x8048725: main (speller.c:45)
==16497== Address 0x71f4fe8 is not stack'd, malloc'd or (recently) free'd
==16497==
==16497==
==16497== HEAP SUMMARY:
==16497== in use at exit: 576 bytes in 3 blocks
==16497== total heap usage: 367,047 allocs, 367,044 frees, 41,109,744 bytes allocated
==16497==
==16497== 224 (112 direct, 112 indirect) bytes in 1 blocks are definitely lost in loss record 2 of 3
==16497== at 0x402C109: calloc (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==16497== by 0x80490DD: load (dictionary.c:80)
==16497== by 0x8048725: main (speller.c:45)
==16497==
==16497== LEAK SUMMARY:
==16497== definitely lost: 112 bytes in 1 blocks
==16497== indirectly lost: 112 bytes in 1 blocks
==16497== possibly lost: 0 bytes in 0 blocks
==16497== still reachable: 352 bytes in 1 blocks
==16497== suppressed: 0 bytes in 0 blocks
==16497== Reachable blocks (those to which a pointer was found) are not shown.
==16497== To see them, rerun with: --leak-check=full --show-leak-kinds=all
==16497==
==16497== For counts of detected and suppressed errors, rerun with: -v
==16497== ERROR SUMMARY: 4 errors from 4 contexts (suppressed: 0 from 0)
Here's my code:
root = calloc(1, sizeof(node));
node* current = root;
for (int c = fgetc(dp); c != EOF; c = fgetc(dp))
{
if (c != '\n')
{
int index = c - '\'';
// This is line 78 (the first valgrind invalid read):
if (current->children[index] == NULL)
{
// line 80 (invalid write)
current->children[index] = calloc(1, sizeof(node));
}
// 83 (invalid read)
current = current->children[index];
}
else
{
current->is_word = true;
count++;
current = root;
}
}
if(!ferror(dp))
{
loaded = true;
return true;
}
else
{
loaded = false;
return false;
}
fclose(dp);