【问题标题】:terminated by signal SIGSEGV (Address boundary error) in recursive function由递归函数中的信号 SIGSEGV(地址边界错误)终止
【发布时间】:2016-08-22 20:47:05
【问题描述】:

我正在尝试实现 Karatsuba 乘法算法。我有点遵循这个 wiki page 中的伪代码。但我总是收到这个错误:

由信号 SIGSEGV 终止(地址边界错误)

当我用其他东西替换导致递归发生的行时:

z0 = multiply(a, c);
z1 = multiply(b, d);
z2 = multiply(a+b, c+d);

错误消失了。

这是我的代码:

#include <iostream>
#include <math.h>

long int multiply(int x, int y);
int get_length(int val);

int main()
{
  int x = 0, y = 0;
  long int result = 0;

  std::cout << "Enter x: ";
  std::cin >> x;
  std::cout << "Enter y: ";
  std::cin >> y;

  result = multiply(x, y);
  std::cout << "Result: " << result << std::endl;
  return 0;
}

long int multiply(int x, int y)
{
  if(x < 10 || y < 10) {
    return x * y;
  }

  int x_len = get_length(x);
  int y_len = get_length(y);

  long int z0 = 0 , z1 = 0, z2 = 0;
  int a = 0, b = 0, c = 0, d = 0;

  a = x / pow(10, x_len);
  b = x - (a * pow(10, x_len));
  c = y / pow(10, y_len);
  d = y - (c * pow(10, y_len));

  z0 = multiply(a, c);
  z1 = multiply(b, d);
  z2 = multiply(a+b, c+d);

  return (pow(10, x_len) * z0) + (pow(10, x_len/2) * (z2 - z1 - z0)) + z1;
}

int get_length(int val)
{
  int count = 0;
  while(val > 0) {
    count++;
    val /= 10;
  }
  return count;
}

【问题讨论】:

  • 您为xy 输入了什么值?此外,您似乎不了解pow 函数。它不是整数函数。
  • @DavidSchwartz 任何大于 9 的值都会导致错误。
  • 没看代码我还是大胆猜测一下:无限递归,导致栈溢出……
  • @JesperJuhl 是的!正如你所说,我明白了,这是一个无限递归。因为a = x / pow(10, x_len); 和其他类似的行。应该是a = x / pow(10, x_len / 2);

标签: c++ recursion segmentation-fault karatsuba


【解决方案1】:

我找到了问题的原因。 是因为这几行:

a = x / pow(10, x_len);
b = x - (a * pow(10, x_len));
c = y / pow(10, y_len);
d = y - (c * pow(10, y_len));

它应该是x_len / 2 而不是x_len 并且与y_len 相同。因为它导致递归是无限的。

【讨论】:

    【解决方案2】:

    您正在使用pow 函数进行整数幂运算。它不是整数函数。编写适合您应用程序的您自己的 pow 函数。例如:

    int pow(int v, int q)
    {
        int ret = 1;
        while (q > 1)
        {
            ret*=v;
            q--;
        }
        return ret;
    }
    

    确保在顶部放置int pow(int, int);

    【讨论】:

    • 你的意思是因为它返回double而不是int
    • @RafaelAdel 这不是整数幂函数,您需要整数幂函数。不仅仅是它的返回值,还有它的参数和逻辑。
    • @Rafael -- 阅读this thread,了解为什么不应该使用pow 进行整数运算。
    • 好的,谢谢@PaulMcKenzie & David Schwartz
    猜你喜欢
    • 1970-01-01
    • 2017-06-23
    • 1970-01-01
    • 1970-01-01
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    相关资源
    最近更新 更多