Argc 返回 1,argv 返回 NULL,尽管输入了命令行参数

Argc returning as 1, argv returning NULL, despite putting in command line arguments

我想我对 C 命令行参数有点生疏。我查看了我的一些旧代码,但无论这个版本是什么,都会出现段错误。

运行 的方式是 ./foo -n num(其中 num 是用户在命令行中输入的数字)

但不知何故它不起作用。我哪里出错了?

编辑:当我尝试访问 atoi(optarg) 时出现段错误,atoi(0x0) 发生段错误。

int main(int argc, char *argv[])
{
    int c;
    int maximum_n = max_n(); /* Stores the maximum value in the sequence a long can hold */
    unsigned long *array = NULL;

    while((c = getopt(argc, argv, ":n:")) != -1) {

        switch(c) {
        case 'n':
            if(atoi(optarg) > maximum_n) {
                printf("n is too large -- overflow will occur\n");
                printf("the largest Fibonacci term than can be calculated is %d\n", maximum_n); 
                exit(EXIT_SUCCESS);
            }
            else {
                array = fib_array(atoi(optarg));
            }
            break;
        }   
    }

    printf("The %d Fibonacci term is %lu\n", atoi(optarg), array[atoi(optarg)]);

    return 0;
}

像许多编程语言一样,在 C 中 argv[0] 通常包含程序的名称。该值实际上取决于用于启动进程的 exec* 系统调用的参数。出于您的目的,该部分无关紧要。需要注意的重要一点是 argc 总是比您的程序在命令行上接收到的参数数量大 1。在你的情况下 argc == 3argv 的值应该看起来像

argv[0]: "./foo"
argv[1]: "-n"
argv[2]: "10"

您的程序出现段错误的原因是您在 optarg 不再有效后访问它。每次调用 getopt() 时,optarg 的值都会改变。当您在 while 循环之外调用它时,它已更改为 NULL。当您处于 'n'.

的 switch case 时,您应该将 atoi(optarg) 的值存储到一个变量中

由于您仍然对此感到困惑,我已经用必要的修复更新了您的代码。

int main(int argc, char *argv[])
{
    int c;
    int maximum_n = max_n(); /* Stores the maximum value in the sequence a long can hold */
    unsigned long *array = NULL;
    int n = -1;

    while((c = getopt(argc, argv, ":n:")) != -1) {

        switch(c) {
        case 'n':
            n = atoi(optarg);
            if(n > maximum_n) {
                printf("n is too large -- overflow will occur\n");
                printf("the largest Fibonacci term than can be calculated is %d\n", maximum_n); 
                exit(EXIT_SUCCESS);
            }
            else {
                array = fib_array(n);
            }
            break;
        }   
    }

    if (n == -1)
    {
        printf("You must specify a value with -n\n");
        return 1;
    }

    printf("The %d Fibonacci term is %lu\n", atoi(optarg), array[n]);

    return 0;
}

问题出在这里:

 printf("The %d Fibonacci term is %lu\n", atoi(optarg), array[atoi(optarg)]);

当 getopt 没有更多参数要处理时,optarg 设置为 NULL。函数 atoi 没有正确的错误检查导致 SIGSEGV。