2016-09-03 10 views
-2

どのステップでも整数に変換せずに2つのバイナリストリング(それぞれサイズが異なる)を掛けようとしています。私のコードhereがあります。それは何度も動作しますが、時にはそれは私に次のエラーを与える:Malloc 2372(エラー)どこが間違っているのかを特定することができません

a.out: malloc.c:2372: sysmalloc: Assertion `(old_top == 
(((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - 
__builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || 
((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof 
(struct malloc_chunk, fd_nextsize))+((2 *(sizeof(size_t))) - 1)) & ~ 
((2 *(sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && 
((unsigned long) old_end & pagemask) == 0)' failed. 

Aborted (core dumped). 

私はsearchedスタックオーバーフローで、このエラーのためではなく、過去3日以来、私のコードでエラーを把握することができていません。私は自分のコードが最高ではないことを知っていますが(strlenを複数回使用しています)、このコードのエラーを理解するのを助けてください。

+1

valgrindまたは同様のメモリ使用率デバッガで実行します。 –

+0

あなたはその入力をどのように受け取っていますか? –

+0

もし最初の文字列と2番目の文字列の両方にビット数300を入力し、両方の文字列を1111111 ..... 300 times – rjmessibarca

答えて

2
char *chut =malloc((strlen(ans))*sizeof(char)); 
int j=0; 
for(j=0;j<strlen(ans);j++) 
    chut[j]=ans[j+1]; 
chut[j]='\0'; 
return chut; 

我々はchutを割り当てたとき、私たちはstrlen(ans)バイトを割り当てられました。だから我々が行うときchut[j]='\0';jstrlen(ans)より小さくなる必要があります。 (3つを割り当てた場合、3つの有効なインデックスは0,1,2です。したがって、有効なインデックスになるには、はstrlen(ans)より小さくなければなりません)。

ただし、ループ条件はj<strlen(ans)です。ループを終了すると、j<strlen(ans)というケースはできません。

だからjstrlen(ans)より小さくする必要があります。しかし、jはおそらくstrlen(ans)より小さくできません。ブーム。

mallocコールでstrlen(ans)の前に1+を追加します。

ところで、このコードはわかりにくく、デバッグが難しいです。それはどこにでもメモリリークを持っています。そして、それはconstとは何でないのかを把握していません。また、コメントはありません。これにより、コードをデバッグするのに多くの経験が必要になります。

少なくとも、assertを追加してください。それはあなたのためにこのエラーをキャッチしたでしょう。

+0

と入力すると、申し訳ありませんが...これは文字どおり、それをもっと "可読な"ものにしようとしています...ありがとうございました....あなたに十分に感謝してはいけません...また、 "アサート"とは何ですか? – rjmessibarca

+0

私はメモリリークを避ける方法を教えてもらえますか?そうするためにポインタを解放する必要があることは分かっていますが、同じ文字列が複数の関数で呼び出されているため問題になりません。 – rjmessibarca

+1

@rjmessibarca 'assert 'は、プログラマが一度も起こりえないことを予期し、報告する条件を検出するコード行です。この場合、プログラマは 'j'が' <= strlen(ans) 'であると予想していたので、それをアサートする必要があります。 –

関連する問題