【问题标题】:Segmentation fault when trying to check command line arguments (in C)尝试检查命令行参数时出现分段错误(在 C 中)
【发布时间】:2014-05-29 02:13:29
【问题描述】:

我想在命令行中给出几个参数,比如:

./programName -a 103 -p argument1,argument2,argument3

然后,我想用这些参数的值创建几个变量:一个整数变量用于标记-a 之后的数字,一个整数变量用于标记-p 之后的参数数量和一个数组变量与所有这些论点。

它总是相同的参数(所以我的代码不能管理其他形式的输入):-a(整数)-p(用,分隔的参数列表)

我的问题是存在分段错误。在多次尝试查看它发生的位置后(使用多个printf),当变量 a = 3 时(因此在标志 -p 处)存在分段错误。并且分割发生在“case 'p'”这一行。

我不明白为什么这段代码接受参数“-a”而不接受“-p”。而且我认为我的代码在“case 'p'”中没有错误,因为之后发生分段错误(在“case 'p'”行上)。

我希望你能理解我的问题并感谢你的帮助:)。

编辑:

感谢 Mark Wilkins 和 ooga 的回答。分段错误确实是由于未初始化的数组的各个元素。 如果有些人不知道如何有效地初始化一个字符串数组,请检查this other question,它的解释很好;):

Initialize array of strings

【问题讨论】:

  • 你确定你在使用char* chrp = argv[p+1];吗?因为没有定义 p...
  • 当代码执行number_a = strtol(argv[a+1],NULL,10); 时,它不知道argv[a+1]; 不为NULL。也许使用for( ;a < (argc-1); )
  • 还没有完成,但你的休息应该没有花括号?
  • 正如您所承认的,有很多问题适用于这个确切的输入但会中断其他输入。例如,number_p 应在 case P 中重置为 0。如果您有除-a-p 之外的任何参数,那么您的for 循环永远不会前进(无限循环)。如果你有-a-p 后面没有参数,那么你取消引用一个空指针。等等。

标签: c shell command-line segmentation-fault command-line-arguments


【解决方案1】:

当您将 'a' 增加 2 时,您将离开 argv 数组的末尾。您只想增加 1,因为它索引的是命令行中的单词(以空格分隔)而不是字符。

【讨论】:

  • 但他的选项是单独的词。
  • 对 - 每次他解析一个单词时,他都会将“a”(单词的索引)增加 2。
  • 我认为每次他解析 两个 单词时它都会增加 2。
  • @ooga:for 循环 also 将 a 增加 1。a++; 就足够了,在 OP 有 a + 2 的两个地方。
  • @Jongware 那我一定是产生幻觉了,因为我在 for 循环中看不到增量。
【解决方案2】:

会导致分段错误的一个问题是使用arg_p。它被声明为char* 的数组,但数组的各个元素从未初始化。后续使用它会导致访问一个未初始化的指针:

*(arg_p[b]+c) = *(chrp+c);

【讨论】:

    【解决方案3】:

    您的段错误发生在组装您的参数数组时。试试这个:

        arg_p[0] = chrp;
        chrp2 = strchr(argv[a+1], ',');
        int b = 1;
        while (chrp2 != NULL) {
            *chrp2 = '\0';
            arg_p[b++] = chrp2 + 1;
            chrp2 = strchr(chrp2 + 1, ',');
        }
    

    还请注意,您的 arg_p 数组是在该块本地声明的,并且在该块之后将不再存在。您可能想要声明一个char** arg_p 指针并分配空间。记得在最后释放它。

    【讨论】:

    • 澄清:这是因为argv[i]指向的字符串是可写的;并且 OP 代码失败,因为正在使用未初始化的指针 arg_p[b]arg_p[] 数组中的指针都需要指向某个地方; ooga 的解决方案让它们指向argv 数组中的实际参数,用字符串结束标记替换逗号。这比分配新空间要简单。
    猜你喜欢
    • 1970-01-01
    • 2020-11-25
    • 1970-01-01
    • 2020-09-16
    • 2020-09-03
    • 1970-01-01
    • 2022-10-19
    • 2014-03-22
    相关资源
    最近更新 更多