我是C语言的新手,当在控制台中传递此错误时,我不知道如何摆脱此错误。我尝试着看其他问题,但实际上我不知道要寻找什么。我尝试查看argv的运行,但没有发现任何突出的内容。
./calculate factorial 4
Segmentation fault (core dumped)
程序:
#include "calculate.h"
int main(int argc, char * argv[])
{
if(strcmp(argv[1], "factorial") == 0){
int result = factorial(argc, argv);
printf("%d\n", result);
}
else if(strcmp(argv[1], "combination") == 0){
int result = combination(argc, argv);
printf("%d\n", result);
}
else if(strcmp(argv[1], "permutation") == 0){
int result = permutation(argc, argv);
printf("%d\n", result);
}
else if(strcmp(argv[1], "pythagorean") == 0){
int result = pythagorean(argc, argv);
printf("%d\n", result);
}
else{
printf("You did not use a valid input!\n");
}
printf("Assignment1-4");
return 0;
}
int factorial(int argc, char * argv[]){
int i = atoi(argv[3]);
if ( i == 0 ){
return 1;
}
return(i * factorial((i - 1),argv));
}
int combination(int argc, char * argv[]){
int n = atoi(argv[3]);
int i = atoi(argv[4]);
return(factorial(n,argv) / (factorial(i,argv) * factorial((n- i), argv)));
}
int permutation(int argc, char * argv[]){
int n = atoi(argv[3]);
int i = atoi(argv[4]);
return(factorial(n,argv) / factorial((n-i), argv));
}
int pythagorean(int argc, char * argv[]){
int c = 0;
int a = atoi(argv[3]);
int b = atoi(argv[4]);
c = (a*a) + (b*b);
c = sqrt(c);
return c;
}
我只是找不到问题,谢谢。
最佳答案
在函数factorial()中,将argv [3]分配给i。但是在使用./calculate factorial 4
运行程序时,没有argv [3]条目。这意味着argc只有3(argv数组的长度是3)。您正在访问argv []数组超出其范围。使用i = atoi(argv[2])
获取预期值。
同样在递归调用中,我总是用argv []值初始化。因此它将永远不会达到0并导致无限循环。
编写如下的factorial()并以factorial(atoi(argv[2]))
的形式从main()调用
int factorial(int i){
if ( i == 0 ){
return 1;
}
return(i * factorial((i - 1));
}
关于c - 程序中的段错误(核心转储)错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50849934/