我正在编写一个使用karatsuba算法乘以大数字的程序。 有一个递归函数。 在递归调用之前,我打印字符串值,它们没问题。然后,在开始的这个函数里面我再次打印传递的参数(我应该得到与递归调用之前完全相同的结果,早期的printf())并且我得到分段错误。
这不是在第一次执行函数时发生的,而是在许多递归调用之后发生的。
我的代码:
void karatsuba(char *result, char *first, char *second)
{
printf(" %s %s\n", first, second);
<somewhere here conditional return to end recursion>
...
...
printf(" %s %s\n", temp_first, temp_second);
karatsuba(temp, temp_first, temp_second);
...
...
}
在这种情况下会导致分段错误的原因是什么?
更新
谢谢大家的回答。堆栈溢出可能是原因。 我创建了一个在递归函数开始时递增的静态计数器,并在每个函数结束时递减并打印它。在分段故障时,其值表示深度为46778。
然后,我增加了堆栈大小,因为 Graham Borland 指向32MB。现在,计数器指示了159126个调用的深度,因此增加堆栈大小使其更好。
此函数中的数据总和为140B。将此值乘以堆栈深度可得到21MB,小于32MB。
毕竟,这个递归调用的数量太大了。在纸上进行计算我最多进入&lt; 10次递归调用我的数据。可以无限递归。 :(
答案 0 :(得分:2)
你可能会破坏筹码。根据平台的不同,您可以增加流程可用的堆栈。例如,在类Unix的平台上,在运行程序之前在bash提示符处输入:
ulimit -s 32768
会将堆栈增加到32MB。
答案 1 :(得分:1)
最可能的原因是:
堆栈溢出
无限递归?