为什么这个函数会导致段错误?

时间:2013-03-06 18:50:12

标签: c segmentation-fault

我编写了以下简单函数来执行模幂运算。但是,当指数参数大于约261,000时,它会发生段错误。为什么是这样?我该如何解决?

我正在使用64位Ubuntu上的gcc进行编译。

由于

unsigned int modex(unsigned int base, unsigned int exponent, unsigned int modulus)
{
   if(exponent == 1)
      return base;

   base = base % modulus;

   if(exponent == 0 || base == 1)
      return 1;

   return (modex(base, exponent - 1, modulus) * base) % modulus;
}

3 个答案:

答案 0 :(得分:5)

@ouah已经在评论中发布了答案,所以如果他想发一个答案,我会删除它。

你有堆栈溢出。您正在递归太多次并且会浪费您的堆栈空间。 C ++不保证尾部调用优化(即使你最后没有对递归调用的返回值进行该操作),所以最好使用循环实现它。

如果你想坚持使用递归路由,可以尝试通过解释here使其真正的尾递归,看看编译器是否可以帮助你。

答案 1 :(得分:2)

您正在创建一个巨大的递归链。你应该尝试通过迭代来节省内存和处理。

unsigned modex(unsigned base, unsigned exponent, unsigned modulus){

    unsigned
        result = 1;

    while(expoent--){
        result *= base;
        result %= modulus;

    }

    return result;

}

不过,你可以做得更快。

答案 2 :(得分:1)

你的递归变得如此之深以至于占据了整个麻袋。请考虑使用while循环。