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选项 with 。gcc这将为具有所有功能地址的可执行文件生成一个映射文件。您可以映射错误指令地址或堆栈跟踪以找到导致崩溃的函数。

于 2013-02-18T04:59:58.747 回答
1

这是您的程序中发生的崩溃。原因在第一行中说明double free or corruption

由于您的预期输出很好,我的猜测是,当您在最后释放资源时,您在某处的同一内存位置调用 free 两次。

如果不容易找到发生这种情况的位置,请使用 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
为避免此类错误,最好使用在对 的调用中分配的指针,malloc例如malloc (m * sizeof *multiply)
Also,正如您所看到的,您已经为元素malloc编辑了m元素,multiply但为 分配了q。尝试在分配和释放中更改q为。 类似的东西: m

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

旁注:
的签名main应该是int main(void),请注意 in Cmain()与 不同main(void)

希望这可以帮助!

于 2013-02-18T05:55:39.823 回答