2017-01-16 9 views
0

を使用している場合valgrindのを使用しているとき、私はこの出力を取得しています:無効読み取りvalgrindの

else 
{  
    currentList = headList; 
    printf("This is where I will put the code to create the Linked list!\n"); 
    if(currentList != 0) 
    { 
     while(currentList->nextList != 0) 
     { 
      if(currentList->key = key) 
      { 
       asprintf(&buff, "%s %s", currentList->value, dirValue); // PROBLEM IS HERE 
       printf("Here is the new string that holds the directory paths: %s\n", buff); 
       currentList->value = buff; 
       free(buff); 
       printf("Here is the new string that holds the directory paths: %s\n", currentList->value); 
       return; 
      } 
      currentList = currentList->nextList; 
     } 

     currentList->nextList = malloc(sizeof(struct List)); 
     printf("Adding a new node\n"); 
     //Reached the end of the Linked list and didn't find the 
     //same key so create a new node. 
     currentList = currentList->nextList; 
     currentList->key = key; 
     currentList->nextList = NULL; 
     currentList->value = dirValue; 
    } 
} 

:私は自分のコードに問題があることに、それを絞られているのはここ

==19923== Invalid read of size 1 
==19923== at 0x52CCCC0: vfprintf (vfprintf.c:1632) 
==19923== by 0x52F4772: vasprintf (vasprintf.c:59) 
==19923== by 0x52D3A56: asprintf (asprintf.c:35) 
==19923== by 0x400D77: addToList (pa1.c:124) 
==19923== by 0x4010AF: md5Hash (pa1.c:220) 
==19923== by 0x401138: newFile (pa1.c:244) 
==19923== by 0x401260: searchDirects (pa1.c:280) 
==19923== by 0x401451: main (pa1.c:339) 
==19923== Address 0x585b720 is 0 bytes inside a block of size 27 free'd 
==19923== at 0x4C2EDEB: free (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==19923== by 0x401144: newFile (pa1.c:246) 
==19923== by 0x401260: searchDirects (pa1.c:280) 
==19923== by 0x401382: directoryCheck (pa1.c:312) 
==19923== by 0x4012CD: searchDirects (pa1.c:290) 
==19923== by 0x401451: main (pa1.c:339) 
==19923== Block was alloc'd at 
==19923== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so) 
==19923== by 0x52F47D7: vasprintf (vasprintf.c:73) 
==19923== by 0x52D3A56: asprintf (asprintf.c:35) 
==19923== by 0x40112C: newFile (pa1.c:239) 
==19923== by 0x401260: searchDirects (pa1.c:280) 
==19923== by 0x401382: directoryCheck (pa1.c:312) 
==19923== by 0x4012CD: searchDirects (pa1.c:290) 
==19923== by 0x401451: main (pa1.c:339) 

があります私は多くのエラーがあり、valgrindの出力全体を提供することは、私が過度の気持ちになるだろう。 asprintf()("addToList (pa1.c:124)" line in the report)を使用している場所に戻ってくるすべてのエラー。コードの上に私はchar *buff = NULL;を初期化し、currentList->valueはasprintfを使って追加したい文字列を保持しています。何故、私が何度も無効な読込みサイズ1のエラーが発生していると推測されます。また、asprintf()から結果をプリントアウトするときに、文字列が期待どおりに追加されます。

+1

正確なエラーが発生するかどうかは不明ですが、if(currentList-> key = key) 'にする必要があります。 ' – kaylum

+0

valgrindエラーは、解放されたメモリ。 – melpomene

+3

'currentList-> value = buff;フリー(バフ); '?リンクされているものの割り当てを解除することは、少なくとも重大な論理エラーであるようです。 –

答えて

2

無効な読み取りは、既に解放されたメモリブロックの先頭にあります。あなたはそれを解放した後でメモリを使用しようとしています。

currentList->value = buff; 
free(buff); 
printf("Here is the new string that holds the directory paths: %s\n", currentList->value); 
return; 

あなたはprintf()currentList->value = buff;を使用していますが、あなただけのbuffを解放しました。これは差し迫った災難を喚起する。 がreturnの後に関数を呼び出す際に使用される場合、大きな問題があります。

の前にprintf()を移動することで1つの警告を修正できますが、コードに大きな問題があるように見えます。 free(buff);を削除する方が良いかもしれませんが、代わりに実際にデータが解放される場所を検討する必要があります。

+0

上記のコメントの両方のユーザーが私の欠陥を指摘しましたが、わかりやすくするために、あなたの答えを正しく示しています。私は実際に新しい文字列が必要なので、無料で削除しました。愚かな間違いだが、私がやっていたことの別の説明は、私の問題が何であったか(あなたが上記のように自由に呼び出された記憶を呼び出すこと)をかなり明白にした。ありがとう! – MuffinMan1042

関連する問題