valgrind:无效的读取大小和堆栈溢出

时间:2015-03-24 16:29:57

标签: c stack-overflow valgrind

当我运行这个程序来计算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?

2 个答案:

答案 0 :(得分:1)

没有参数
你在一个未定义的变量上调用atoi() 首先,你应该检查

if(argc != 3){ //check if there are three arguments
    //error code
}

堆栈溢出
始终使用a=-5b=4a < b。这会导致无限递归,最终导致堆栈溢出。

答案 1 :(得分:0)

gcd的一个输入为负数而另一个为正数时,递归永远不会结束。正数继续增长,负数在每个连续的递归调用中保持不变。显然,这会导致堆栈溢出。

当您将两个负数传递给gcd时,下一个递归调用也会让您进入该状态。