具有多个char *比较的分段错误

时间:2016-10-03 06:25:40

标签: c arrays char segmentation-fault comparison

我有一个C程序进行以下比较:

void compare(char** args) {
    if (find_in_args(args, ">") != -1) {
        printf("In > block");
    }
    else if (find_in_args(args, "<") != -1) {
        printf("In < block");
    }
    else if (find_in_args(args, "|") != -1) {
        printf("In | block");
    }
}

其中find_in_args()遍历char*数组,如下所示:

int find_in_args(char** args, char* target) {
    int found = -1;
    int i = 0;
    while (i != 10) {
        if (strcmp(args[i], target) != 0)
            ++i;
        else {
            found = i;
            break;
        }
    }
    return found;
}

如果target恰好是“&gt;”,则程序会输出In > block。如果target碰巧是“&lt;”或“|”,程序输出Segmentation fault (core dumped)

但是,如果我移动“&lt;”阻止为第一个,程序将输出In < block,如果target碰巧是“&gt;”,则会给出分段错误错误或“|”。

使用char*迭代strcmp()数组的比较似乎只能一次。我已尝试为args的每次调用复制find_in_args并在副本上执行比较,但同样的问题也会发生。

有没有人知道为什么我只能调用一次比较函数,如果是这样,如何制作它以便我可以调用比较函数n次而不会出现分段错误?

2 个答案:

答案 0 :(得分:0)

问题是由i != 10循环中的while引起的。根据条件while更改args[i] != NULL循环以进行迭代将解决问题。

答案 1 :(得分:0)

除此之外,此代码部分还绑定了segfault:

while (i != 10) {
    if (strcmp(args[i], target) != 0)
        ++i;

您没有指定如何调用函数compare,但看起来很可能没有正确分配args指向char的10个指针。因此,当您在i循环中增加while时,它会指向某个无效/非法位置,因此会出现段错误。

一些建议:

  • 定义程序中10的内容。
  • comparefind_in_args函数中,有一个额外的参数来指示args应该指向char的指针数。
  • 确保正确分配/初始化args