所以我试图更好地学习函数,并且能够编写一个有用的函数,然后编写一个递归的函数并对给定给程序的数字列表进行排序。但是我在这里遇到了分段错误。当我在argv[i+1]
中用完条目时,当我尝试阅读argv[]
时,我觉得这种情况正在发生。但是,为什么我的if(i < argc){
语句检查不会阻止这种情况发生?
这是我的代码。
#include <stdio.h>
#include <ctype.h>
#include <math.h>
#include <string.h>
#include <stdbool.h>
bool compare(val1,val2)
{
if(val1 > val2){return false;}
else{return true;}
}
// int values[], int n
int main(int argc, char *argv[])
{
for(int i=1; i<argc; i++){
//print unsorted list
printf("%s\n",argv[i]);
if(i < argc){
if(compare(*argv[i],*argv[i+1]))
{
printf("true\n");
}
else
{
printf("false\n");
}
}
// Add else for odd numbered lists
}
return 0;
}
答案 0 :(得分:2)
为什么我的
stty
语句检查不会排除这种情况 从发生?
如果i小于argc(参数计数),则此语句允许代码继续。假设你有三个参数,我被允许以2或更小的值继续。
在下一行中,您尝试访问argv [i + 1]。我们已经确定我可能是2,所以你试图访问索引3处的项目。它是0索引并且有3个项目(0,1,2),所以你试图访问一个没有的项目存在。
if(i < argc){
答案 1 :(得分:1)
argv[i+1]
, i==argc-1
未定义。
例如,如果argc=3
表示您使用了两个参数(argv[0]
,argv[1]
和argv[2]
,则会定义这些参数。当argv[3]
等于argv[i+1]
时,当您致电i
时,您正试图访问2
。
您所要做的就是重新定义for
并移除if(i < argc)
。
您的代码可能如下所示:
for(int i=1; i < argc-1; i++){
//print unsorted list
printf("%s\n",argv[i]);
if(compare(*argv[i],*argv[i+1]))
printf("true\n");
else
printf("false\n");
}