在数组上获取无效位置

时间:2019-11-25 11:39:38

标签: c arrays pointers

我正在编写一个程序,该程序读取一个值列表以及3个值a,b,elem。我写了一个函数来查找元素是否是位置a和b之间的数组的一部分。当我运行程序时,有时我得到正确的结果,有时我得到错误的结果。我找不到错误。任何帮助都将受到欢迎。

int binary_search(int *v, int elem, int a, int b);

int main()
{
    printf("Inserire la lunghexza di N:\n");
    int N;
    scanf("%d", &N);
    printf("Inserire i valori dell'array:\n");
    int arr[N];
    for (int i = 0; i < N; i++) {
        scanf("%d", &arr[i]);
    }
    int a,b,elem;
    printf("Inserire i valori di a, b, elem:\n");
    scanf("%d", &a);
    scanf("%d", &b);
    scanf("%d", &elem);
    printf("%d", binary_search(arr,elem,a,b));
    return 0;
}

int binary_search(int *v, int elem, int a, int b)
{
    for (int i = 0; i < i < b - a; i++) {
        if (*(v + a - 1 + i) == elem) {
            return a + i;
        }
    }
    return -1;
}

2 个答案:

答案 0 :(得分:2)

就像阿德里安已经指出的那样,这行看起来很奇怪:

for (int i = 0; i < i < b - a; i++)

您的意思是:

for (int i = 0; i < b - a; i++)

答案 1 :(得分:1)

正如另一个答案已经指出的那样,i < i < b - a循环条件下的表达式for很奇怪,但是不能解释为什么?

for (int i = 0; i < i < b - a; i++)
                ^^^^^^^^^^^^^

您是否在此表达式上收到任何编译器警告?如果是,则有一个建议-警告由于某种原因存在,请不要忽略它们。

在表达式i < i < b - a中,假设b - a的结果为x。因此,表达式i < i < x将被评估为(i < i) < x (因为运算符<的关联性从左到右),其中(i < i)将始终结果为false,对于truea的所有有效 ** 值,满足条件{{ 1}},并且如果b值在数组中不存在,则由于这种情况

b > a

您的程序最终无法访问数组,这是未定义的行为。

因此,首先通过删除多余的elem来纠正if (*(v + a - 1 + i) == elem) { ^^^^^^^^^^^^^^^^ 循环条件:

for

现在,使用此方法,循环将检查从数组中的第i < 个元素到第for (int i = 0; i < b - a; i++) th 个元素的值。< / p>

此外,与您当前的a版本相比,以下内容更具可读性:

b - 1

您的程序中还有另一个问题- ** 您的程序未检查用户输入binary_search()int binary_search(int *v, int elem, int a, int b) { for (int i = a - 1; i < b; i++) { if (v[i] == elem) { return i; } } return -1; } 的有效性。用户可能不小心输入了a和/或b的值,该值不在数组范围内,也不是负值,或者a的值大于b等等。您还应该检查用户输入的有效性。

PS:我假设您非常了解以下事实:在您的程序中,a函数正在执行线性搜索,而二进制搜索需要按排序顺序输入数组。