当只有 argc[1] 时,为什么我的代码会产生分段错误?

问题描述

我正在学习 CS 入门课程 (CS50x),但遇到了一个小问题。

为什么这个 C 代码在只有 #gfortran -c /home/myUser/Fortran/tests/main.f90 -o main.o gfortran -c main.f90 -o main.o gfortran -o test main.o /home/myUser/PycharmProjects/GSIE_2D/fortran_scripts/libblas.a /home/myUser/PycharmProjects/GSIE_2D/fortran_scripts/liblapack.a rm ./main.o ./test 时会产生分段错误

它应该打印语句。为什么不打印错误

提前致谢!

argc[1]

解决方法

argc 是一个整数参数,用于跟踪命令行中的参数数量,没有 argc[1],如果您提供第二个命令行,可能会有一个 argv[1]参数,否则尝试从不存在的 argv[x] 中读取相当于 undefined behavior,并且可能是您遇到的分段错误的罪魁祸首。

根据这些信息,您会注意到 while 语句毫无意义,argc 保持不变,因此循环将永远不会执行,或者如果 argc 是无限循环不是 2(并且程序不会崩溃)。

if-else 也是可疑的,如果字符是数字或不是数字,它总是打印消息并返回。

不管程序的目标是什么,语法正确的代码应该看起来更像这样:

int main(int argc,string argv[])
{

    if (argc == 2)
    {
        string key = argv[1];

        int finalKey = atoi(key) % 26; //*

        for (int i = 0; i < strlen(key); i++)
        {
            if (!isdigit(key[i]))
            {
                printf("Usage: ./caesar key\n");
                return 1;
            }
        }
    }
    else
    {
        puts("Wrong number of arguments,usage: ./caesar key\n");
    }
}

* 请注意,atoi 非常不安全,请考虑使用 strtol。而且你可以直接在argv[1]i.e. int finalKey = atoi(argv[1]) % 26;

中操作 ,

我想你对argcargv的操作不是很清楚。 argc 表示传递给主函数的参数个数。至少它会收到一个参数(argv[0],它将是编译后的 C 代码的名称)。此外,它将接收您通过命令行传递的所有参数。

总而言之,正确的做法是:

if (argc >=2){
        string key = argv[1];
}

否则,当您尝试访问 segmentation fault 值时,您将获得一个 argv[1]