gpt4 book ai didi

c - 递归函数,传递参数 - 段错误

转载 作者:太空宇宙 更新时间:2023-11-04 07:19:14 26 4
gpt4 key购买 nike

我正在编写一个程序,使用 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 指向 32M​​B。现在,计数器指示 159126 次调用的深度,因此增加堆栈大小使其变得更好。

此函数中的数据总和为 140B。将此值乘以堆栈深度得到 21MB,小于 32MB。

毕竟这个递归调用的次数太大了。在纸上进行计算时,我最多对数据进行 <10 次递归调用。可能无限递归。 :(

最佳答案

您很可能会破坏堆栈。根据平台的不同,您可以增加可用于您的流程的堆栈。例如,在类 Unix 平台上,在运行程序之前在 bash 提示符下输入:

ulimit -s 32768

会将堆栈增加到 32MB。

关于c - 递归函数,传递参数 - 段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22534026/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com