繁体   English   中英

基本的布尔功能给分割带来错误

[英]Basic Bool function giving segmentation fault

因此,我正在尝试更好地学习函数,并且能够编写一个有用的函数,然后再编写一个递归的函数,并对提供给该程序的数字进行排序。 但是,我在这里遇到细分错误。 当我用尽argv[]的条目时,尝试读取argv[i+1]时,我会感觉到这种情况。 但是,为什么我的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;
}

为什么我的if(i < argc){语句不检查此语句,这是不可能发生的?

如果i小于参数计数argc,则此语句允许代码继续执行。 假设您有3个参数,则允许我以2或更小的值进行运算。

在下一行中,您尝试访问argv [i + 1]。 我们已经确定我可能是2,所以您尝试访问索引3处的项目。索引为0,并且有3个项目(0、1、2),因此您尝试访问的项目不包含不存在。

if(compare(*argv[i],*argv[i+1]))

如果i==argc-1argv[i+1]未定义。

例如,如果argc=3表示您正在使用两个参数(已定义argv[0]argv[1]argv[2] )。 i等于2时调用argv[i+1]时,您正在尝试访问argv[3]

您要做的就是重新定义您的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");
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM