当我运行这个程序来计算gcd到valgrind(这是导致错误的部分)时你好:
int gcd( int a, int b ) {
if( a == 0 || b == 0 )
return a + b;
if( a < b )
return gcd(b - a, a);
else
return gcd(a - b, b);
}
int main(int argc, char **argv) {
int a = atoi( argv[1] );
int b = atoi( argv[2] );
int q = gcd(a, b);
fprintf(stdout, "%d\n", q);
return 0;
}
没有参数我得
==22833== Invalid read of size 1
==22833== at 0x3685636EB2: ____strtol_l_internal (in /lib64/libc-2.12.so)
当我使用两个负数 ex:&#39; gcd -5 -4&#39;我得到了
==516== Stack overflow in thread 1: can't grow stack to 0x7fe601ff8
我认为第二个错误(带负数输入)是因为a&lt; b部分这是真的吗? 代码中的哪一部分会导致错误1?
答案 0 :(得分:1)
没有参数
你在一个未定义的变量上调用atoi()
首先,你应该检查
if(argc != 3){ //check if there are three arguments
//error code
}
堆栈溢出
始终使用a=-5
和b=4
,a < b
。这会导致无限递归,最终导致堆栈溢出。
答案 1 :(得分:0)
当gcd
的一个输入为负数而另一个为正数时,递归永远不会结束。正数继续增长,负数在每个连续的递归调用中保持不变。显然,这会导致堆栈溢出。
当您将两个负数传递给gcd
时,下一个递归调用也会让您进入该状态。