这是哨兵线性搜索的错误方法吗?

Is this a wrong approach for sentinel linear search?

本文关键字:方法 错误 哨兵 线性搜索      更新时间:2023-10-16

我正在阅读Thomas H. Cormen的Algorithms Unlocked,我遇到了一种哨兵线性搜索的算法,但我以略有不同的方式编写它。虽然这段代码也有效,但我想知道方法是否错误,因为我正在访问不属于我的内存?

法典:

int lsearch (int a[5], int n) {
    int i = 0;
    a[5] = n;
    while (a[i] != n)
        i ++;
    if (i == 5)
        return -1;
    return i;
}

您正在设置不属于您的内存位置的值。您正在覆盖位于阵列分配内存之后的内存(这是越界访问)。您的程序可能会运行,但它在概念上是错误的(并且取决于编译器和安全检查,在其他情况下可能无法工作)

如果为 a 参数传入的参数少于 6 个元素,则访问a[5]是未定义的行为,在许多情况下会导致问题。给定 a 的声明,我假设您使用 5 元素数组调用函数,因此代码是错误的。

如果参数有 6 个或更多元素,则代码将起作用。但在这种情况下:

  1. 参数声明为int a[5]具有误导性。
  2. 具有修改输入数组的搜索函数可能会被调用者意外。