2010-03-28 90 views
1

我得到在我運行的遞歸函數的堆棧溢出的遞歸程序..堆棧溢出問題,用C

這裏是代碼..

void* buddyMalloc(int req_size) 
{ 
    // Do something here 
    return buddy_findout(original_index,req_size); // This is the recursive call 
} 

void *buddy_findout(int current_index,int req_size) 
{ 
    char *selected = NULL; 

    if(front!=NULL) 
    { 
     if(current_index==original_index) 
     { 
      // Do something here 
      return selected; 
     } 
     else 
     { 
      // Do Something here 
      return buddy_findout(current_index+1,req_size); 
     } 
    } 
    else 
    { 
     return buddy_findout(current_index-1,req_size); 
    } 
} 

考慮初始值的索引爲4,並且它首先執行索引-1直到索引達到0。然後它通過遞增返回到索引4 ..這是我想要實現的。 但它給在命令提示符下使用內存映射堆棧溢出:

這裏是我的shell輸出:

*** glibc detected *** ./473_mem: free(): invalid pointer: 0x00c274c0 *** 
======= Backtrace: ========= 
/lib/tls/i686/cmov/libc.so.6[0xb50ff1] 
/lib/tls/i686/cmov/libc.so.6[0xb526f2] 
/lib/tls/i686/cmov/libc.so.6(cfree+0x6d)[0xb557cd] 
./473_mem[0x8048b44] 
./473_mem[0x8048b74] 
./473_mem[0x8048b74] 
./473_mem[0x8048944] 
./473_mem[0x8048c87] 
./473_mem[0x8048d31] 
./473_mem[0x8048f79] 
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6)[0xafcb56] 
./473_mem[0x8048671] 
======= Memory map: ======== 
0017c000-00198000 r-xp 00000000 08:01 5224  /lib/libgcc_s.so.1 
00198000-00199000 r--p 0001b000 08:01 5224  /lib/libgcc_s.so.1 
00199000-0019a000 rw-p 0001c000 08:01 5224  /lib/libgcc_s.so.1 
00260000-00284000 r-xp 00000000 08:01 1927  /lib/tls/i686/cmov/libm-2.10.1.so 
00284000-00285000 r--p 00023000 08:01 1927  /lib/tls/i686/cmov/libm-2.10.1.so 
00285000-00286000 rw-p 00024000 08:01 1927  /lib/tls/i686/cmov/libm-2.10.1.so 
006cd000-006e8000 r-xp 00000000 08:01 6662  /lib/ld-2.10.1.so 
006e8000-006e9000 r--p 0001a000 08:01 6662  /lib/ld-2.10.1.so 
006e9000-006ea000 rw-p 0001b000 08:01 6662  /lib/ld-2.10.1.so 
00aa9000-00aaa000 r-xp 00000000 00:00 0   [vdso] 
00ae6000-00c24000 r-xp 00000000 08:01 1900  /lib/tls/i686/cmov/libc-2.10.1.so 
00c24000-00c25000 ---p 0013e000 08:01 1900  /lib/tls/i686/cmov/libc-2.10.1.so 
00c25000-00c27000 r--p 0013e000 08:01 1900  /lib/tls/i686/cmov/libc-2.10.1.so 
00c27000-00c28000 rw-p 00140000 08:01 1900  /lib/tls/i686/cmov/libc-2.10.1.so 
00c28000-00c2b000 rw-p 00000000 00:00 0 
08048000-0804a000 r-xp 00000000 00:14 2176  /media/windows-share/OS/Project2/473_mem 
0804a000-0804b000 r--p 00001000 00:14 2176  /media/windows-share/OS/Project2/473_mem 
0804b000-0804c000 rw-p 00002000 00:14 2176  /media/windows-share/OS/Project2/473_mem 
08483000-084a4000 rw-p 00000000 00:00 0   [heap] 
b7600000-b7621000 rw-p 00000000 00:00 0 
b7621000-b7700000 ---p 00000000 00:00 0 
b7716000-b7819000 rw-p 00000000 00:00 0 
b7827000-b782a000 rw-p 00000000 00:00 0 
bfb96000-bfbab000 rw-p 00000000 00:00 0   [stack] 
Aborted 

在此先感謝 ADI

+3

但錯誤是「免費():無效的指針:0x00c274c0 ***」。 – kennytm 2010-03-28 07:04:41

+0

另外,前面是什麼? – Phil 2010-03-28 07:07:52

+0

什麼是original_index? – vladr 2010-03-28 07:09:03

回答

0

看看你的編譯器文檔,看看它是否有「尾遞歸」優化。 (雖然現在你的堆棧溢出問題變得無限循環的問題!)

gcc -foptimize-sibling-calls ...
0

哪裏是front集?

在電話:

else 
    { 
     return buddy_findout(current_index-1,req_size); 
    } 
} 

front爲NULL,你剛回來,以相同的功能與更小current_index和不斷循環和循環。有沒有停止條件current_index == 0

+1

同意,需要完整的代碼給buddy_findout()。 – 2010-03-28 08:28:14

+0

嗨添,我把它修好..謝謝 – Adi 2010-03-28 17:43:51