5

プログラムを正しく実行して正確な結果を得た後、次のように遭遇しましたが、理解できません。

glibc detected *** ./programa: double free or corruption (out): 0x089300a0 ***

======= Backtrace: =========
/lib/libc.so.6[0x8f8c65]
/lib/libc.so.6(cfree+0x59)[0x8fcc59]
./programa[0x804880a]
/lib/libc.so.6(__libc_start_main+0xdc)[0x8a4ebc]
./programa[0x80483e1]
======= Memory map: ========
00870000-0088b000 r-xp 00000000 08:04 1384259    /lib/ld-2.5.so
0088b000-0088c000 r-xp 0001a000 08:04 1384259    /lib/ld-2.5.so
0088c000-0088d000 rwxp 0001b000 08:04 1384259    /lib/ld-2.5.so
0088f000-009e6000 r-xp 00000000 08:04 1384270    /lib/libc-2.5.so
009e6000-009e8000 r-xp 00156000 08:04 1384270    /lib/libc-2.5.so
009e8000-009e9000 rwxp 00158000 08:04 1384270    /lib/libc-2.5.so
009e9000-009ec000 rwxp 009e9000 00:00 0
00ab3000-00abe000 r-xp 00000000 08:04 1384276    /lib/libgcc_s-4.1.2-20080825.so.1
00abe000-00abf000 rwxp 0000a000 08:04 1384276    /lib/libgcc_s-4.1.2-20080825.so.1
00ddb000-00ddc000 r-xp 00ddb000 00:00 0          [vdso]
08048000-08049000 r-xp 00000000 00:17 8620696    /users/c//programa
08049000-0804a000 rw-p 00000000 00:17 8620696    /users/c/programa
08930000-08951000 rw-p 08930000 00:00 0          [heap]
b7fcd000-b7fcf000 rw-p b7fcd000 00:00 0
b7fd8000-b7fda000 rw-p b7fd8000 00:00 0
bfe6f000-bfe84000 rw-p bffe9000 00:00 0          [stack]

Aborted
4

3 に答える 3

3

クラッシュです。これを解決するには、次のいずれかの方法を使用できます。

GDBなどのデバッガーを使用してプログラムを実行し、バックトレース機能を使用してクラッシュしている関数を特定します。

または

ダブル無料のコードを確認してください。(無料のリソースに書いたコードかもしれません。正確な結果が得られていると述べたからです。)

または

プログラムのコンパイル中に-Xlinker -Map=output.mapオプションを使用 します。gccこれにより、すべての関数アドレスを持つ実行可能ファイルのマップ ファイルが生成されます。障害のある命令アドレスまたはスタック トレースをマップして、クラッシュの原因となっている関数を見つけることができます。

于 2013-02-18T04:59:58.747 に答える
1

プログラムで発生したクラッシュです。理由は最初の行に示されていますdouble free or corruption

予想される出力は問題ないので、最後にリソースを解放すると、どこかの同じメモリ位置で free を 2 回呼び出していると思います。

これが発生した場所を見つけるのが容易でない場合は、GDB (CCoder が示唆するように) または他のそのようなデバッガーを使用して追跡します。このエラーが発生すると壊れるはずです。

于 2013-02-18T04:59:27.090 に答える
0

ほとんどの場合、問題はmultiplyポインタの割り当てにあります。このコードには問題があります:

   multiply = malloc(m * sizeof(int)); /* Should be "int*" and not "int" */
   for (i = 0; i < q; i++)
                   ^ - Allocation was for m in statement above
      multiply[i] = malloc(q * sizeof(int));

にメモリを割り当てましたが、には割り当てintていません。この種の間違いを避けるために、の呼び出しで割り当てられて いるポインタを使用する方がよい場合があります。たとえば、の要素を編集したが、の割り当てを行った ことがわかります。割り当てと解放の両方でに変更してみてください。 次の行に何か: int *multiply
mallocmalloc (m * sizeof *multiply)
mallocmmultiplyqqm

multiply = malloc(m * sizeof *multiply);
for (i = 0; i < m; i++)
  multiply[i] = malloc(q * sizeof *multiply[i]);

補足:
の署名はであるmain必要があります。で、はと同じではないことint main(void)に注意してください。 Cmain()main(void)

お役に立てれば!

于 2013-02-18T05:55:39.823 に答える