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=-5
和 b=4
,总是 a < b
。这会导致无限递归,最终导致堆栈溢出。
你好,当我 运行 这个程序通过 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=-5
和 b=4
,总是 a < b
。这会导致无限递归,最终导致堆栈溢出。