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

valgrind: invalid read size and stack overflow

你好,当我 运行 这个程序通过 valgrind 计算 gcd(这是导致错误的部分)时:

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)

当我运行它使用两个负数例如:'gcd -5 -4'我得到

==516== Stack overflow in thread 1: can't grow stack to 0x7fe601ff8

我认为第二个错误(负数输入)是因为 a < b 部分这是真的吗? 代码中的哪一部分本身导致了错误 1?

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

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

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

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

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