我在正确运行程序并获得准确结果后遇到了以下内容,但我不理解它们。
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
答案 0 :(得分:3)
这是一次崩溃。要解决此问题,您可以采用以下方法之一。
使用GDB之类的调试器来运行程序并使用backtrace功能来找出崩溃函数。
或
检查您的代码是否免费。 (可能是您写入免费资源的代码。因为您提到您获得了准确的结果。)
或
在编译程序时,使用-Xlinker -Map=output.map
选项与gcc
。这将生成具有所有功能地址的可执行文件的映射文件。您可以映射错误指令地址或堆栈跟踪以查找导致崩溃的函数。
答案 1 :(得分:1)
这是你的程序中发生的崩溃。原因显示在第一行double free or corruption
由于您的预期输出很好,我的猜测是当您向最后释放资源时,您在同一位置的某个内存位置自由调用两次。
如果要发现这种情况并不容易,请使用GDB(如CCoder建议的那样)或任何其他此类调试器来跟踪它。发生此错误时,它们应该会中断。
答案 2 :(得分: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)
。
另外,您可以看到malloc
的{{1}}元素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)
,请注意,在C
中,main()
与main(void)
不同。
希望这有帮助!