1

プログラムの最後にメモリを解放する際に問題が発生しました。これは学校の演習であり、ADT を使用したバイナリ ツリーの実装と、データ型 char を使用した特定の実装です。

解放コード:

void free_tree(TreeNode *root){
TreeNode *cur;
if (!root) return;
else{
cur = root;
free_tree(cur->left);
free_tree(cur->right);
free(cur->key);               //throws an error!
free(cur);
} }

これは、キー自体をmallocする場所です(問題はおそらくここにあります):

puts("Please enter a value for key of new node");
_flushall();
scanf("%s",&buffer);
user_input = (char *) malloc(sizeof(char)*(strlen(buffer)+1));
strcpy(user_input,buffer);
user_input[strlen(buffer)+1] = '\0';
p_node = create_tree_node(user_input);   //this function append the new data to a new node, returns *TreeNode
insert_node_by_value(&root,p_node,str_comp);
break;

そして、これは私が得るエラーです:

エラーメッセージ

ところで、ノード自体の解放は正常に機能しています!

コードの機能に関するヒントやコメントをいただければ幸いです。

functions.c の完全なコード ペーストは次の場所にあります: http://pastebin.com/TqaNK5v8 - 関数

4

4 に答える 4

1

100 を超える 99 の可能性は、cur- >key が割り当てられていないか、2 回以上解放されていることです。

また

user_input[strlen(buffer)+1] = '\0';

する必要があります

user_input[strlen(buffer)] = '\0';

また、scanf で取得された入力データを保持するために、scanf の前にバッファが割り当てられている必要があります。

貼り付けたコードを見るとわかりません

お役に立てれば

于 2013-01-19T10:00:48.920 に答える
1

私が見つけた唯一の実際の問題は次のとおりです。

 user_input[strlen(buffer)+1] = '\0';

user_input には 'strlen(buffer) + 1' 要素があるため、0 から strlen(buffer) までしかインデックス付けできません。これを解決するには、行を削除するだけです。strcpy の動作は、ソース文字列の \0 をコピーすることです。

于 2013-01-19T10:00:05.923 に答える
0

あなたは自分の誤った診断を他の人に投影しています。デバッグするための最小限のコンパイル可能なテストケースを提供してください。最小限とは、「不要なコードや無関係なコードなしで問題の症状を表示する」ことを意味します。コンパイル可能とは、「エラーを修正したり、空白を埋めたりすることなく、マシン上でコンパイルできる」ことを意味します。

Cでは、mallocの戻り値をキャストする必要はありません。CコードのコンパイルにC++コンパイラを使用するのをやめます。scanfが失敗する可能性があることをご存知ですか?これが、scanfの前に誤ってフラッシュしている理由だと思います。移植性のないハックでうまくいくと想定するのではなく、scanfの失敗を正しく処理してみてください。strcpyが宛先文字列をnullで終了することをご存知ですか?

どの本を読んでいますか?

于 2013-01-19T11:50:55.347 に答える
0

配列のインデックス作成は0から始まります。したがって、nバイトを割り当てる場合、n番目のバイトにアクセスする正しい方法は次のとおりです。

SomeArray[n-1] ;
于 2013-01-19T10:14:15.667 に答える