基本Bool函数给出分段错误

时间:2016-11-05 22:54:43

标签: c

所以我试图更好地学习函数,并且能够编写一个有用的函数,然后编写一个递归的函数并对给定给程序的数字列表进行排序。但是我在这里遇到了分段错误。当我在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;
}

2 个答案:

答案 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");
}