C++ 由递归函数中的信号SIGSEGV(地址边界错误)终止

C++ 由递归函数中的信号SIGSEGV(地址边界错误)终止,c++,recursion,segmentation-fault,karatsuba,C++,Recursion,Segmentation Fault,Karatsuba,我正在尝试实现Karatsuba乘法算法。我有点遵循这个维基中的伪代码。但我总是犯这样的错误: 由信号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

我正在尝试实现Karatsuba乘法算法。我有点遵循这个维基中的伪代码。但我总是犯这样的错误:

由信号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;
}
#包括
#包括
长整数乘法(整数x,整数y);
int get_长度(int val);
int main()
{
int x=0,y=0;
长整数结果=0;
std::cout>x;
std::cout>y;
结果=乘(x,y);

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

int pow(int v, int q)
{
    int ret = 1;
    while (q > 1)
    {
        ret*=v;
        q--;
    }
    return ret;
}
确保在顶部放置一个
intpow(int,int);

我找到了问题的原因。 这是因为这些台词:

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
相同。因为它会导致递归无限。

您为
x
y
输入了哪些值?而且,看起来您不理解
pow
函数。它不是整数函数。@DavidSchwartzger大于9会导致错误。在没有阅读代码的情况下,我仍然会冒险猜测:无限递归,导致堆栈溢出。@JesperJuhl Yes!!正如你所说,我得到了它,它是一个无限递归。因为行
a=x/pow(10,xlen);
和其他类似的行。它应该是
a=x/pow(10,xlen/2);
你的意思是因为它返回
double
而不是
int
?@RafaelAdel它不是一个整数幂函数,你需要一个整数幂函数。它不仅是它的返回值,也是它的参数和逻辑。@Rafael——请阅读为什么你不应该使用
pow
进行整数运算。好的,谢谢@PaulMcKenzie大卫·施瓦茨