尝试检查命令行参数时的分段错误(在C中)

时间:2014-04-14 22:35:53

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

我想在命令行中提供几个参数,例如:

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

然后,我想用这些参数的值创建几个变量:一个整数变量用于紧跟在标志-a之后的数字,一个整数变量用于紧跟在标志-p之后的参数数量和一个包含所有这些参数的数组变量。

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

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

我不明白为什么这段代码接受了#34; -a"但不是" -p"。我并不认为因为我的代码在"案例''""因为分段错误发生在那之后(在第34行' p''")。

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

编辑:

感谢Mark Wilkins和ooga的回答。分段错误确实是由于阵列的各个元素没有被初始化。 如果有些人不知道如何有效地初始化一系列字符串,请查看另一个问题,它已得到很好的解释;):

Initialize array of strings

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

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

    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指针并对该空间进行malloc。记得最后释放它。

答案 2 :(得分:0)

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