Hi~ Could you please tell me the reason I can’t pass CS50 check? It seems there is no error when I run valgrind ./speller texts/lalaland.txt (I count the nodecount q’ty during LOAD and confirmed the nodecount q’ty is 0 after UNLOAD.) The result of valgrind and check50 are as following: ==21620== ==21620== HEAP SUMMARY: ==21620== in use at exit: 0 bytes in 0 blocks ==21620== total heap usage: 367,084 allocs, 367,084 frees, 82,227,504 bytes allocated ==21620== ==21620== All heap blocks were freed -- no leaks are possible ==21620== ==21620== For counts of detected and suppressed errors, rerun with: -v ==21620== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) Helping with... ==21620== All heap blocks were freed -- no leaks are possible ... ==21620== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) Looks like your program doesn't have any memory-related errors! Be sure, though, to test it with other inputs! ~/workspace/pset5/speller/ $ check50 cs50/2018/x/speller Connecting..... Authenticating....... Preparing................ Uploading............. Checking........ :) dictionary.c, dictionary.h, and Makefile exist :) speller compiles :) handles most basic words properly :) handles min length (1-char) words :) handles max length (45-char) words :) handles words with apostrophes properly :) spell-checking is case-insensitive :) handles substrings properly :( program is free of memory errors valgrind tests failed; rerun check50 with --log added to end of command for more information. See https://cs50.me/checks/6c42ab975ef6473130e4f48c1e5e74a5910dffd7 for more detail. :( program is free of memory errors valgrind tests failed; rerun check50 with --log added to end of command for more information. Log running valgrind ./speller substring/dict substring/text... checking for output "MISSPELLED WORDS ca cats caterpill caterpillars WORDS MISSPELLED: 4 WORDS IN DICTIONARY: 2 WORDS IN TEXT: 6 "... checking that program exited with status 0... checking for valgrind errors... Conditional jump or move depends on uninitialised value(s): (file: dictionary.c, line: 33) Use of uninitialised value of size 8: (file: dictionary.c, line: 33) Conditional jump or move depends on uninitialised value(s): (file: dictionary.c, line: 60) bool check(const char *word) { // TODO int j=0; // for children[j] int k; // for strlen(word) node *travs=root; for (k=0;k <= strlen(word) +1;k++) { if(isalpha(word[k]) || word[k]=='\'') this is line:33 { j=tolower(word[k])-'a'; if(j==-58) { j=26; } if (travs->children[j]==NULL) { k=0; travs=root; return false; } else if (travs->children[j]!=NULL) { travs=travs->children[j]; } } //end of if(isalpha(letter) || letter=='\'' ) if(word[k]=='\0') -- this is line: 60 { if (travs->is_word==1) { return true; k=0; } } bool load(const char *dictionary) { root = calloc(1, sizeof(node)); FILE *inptr=fopen(dictionary,"r"); int i=0; //for children[i] if(inptr==NULL) { printf("Error opening file"); return 0; } char letter='\0'; node *ptr=root; do { letter=fgetc(inptr); if (letter=='\n') { ptr-> is_word=true; wordcount++; ptr=root; } if(isalpha(letter) || letter=='\'' ) { i = tolower(letter) - 'a'; if (i==-58) //ASCII code of '\'' - 'a' { i=26; } //check children[i]’s value, if the value in children[i] is NULL, calloc a new node, then let children[i] point to it if(ptr->children[i]==NULL) { ptr->children[i] = calloc(1, sizeof(node)); nodecount++; ptr=ptr->children[i]; } else if (ptr->children[i]!=NULL) { ptr=ptr->children[i]; } } // end of if(isalpha(letter) || letter=='\'' ) } // end of do while (letter != EOF); fclose(inptr); return true; } // end of bool load(const char *dictionary)