在代码块中获取垃圾值作为我的搜索值 IDE

Getting garbage value as my search value in code-blocks IDE

我正在 code::blocks IDE 中尝试简单的线性搜索,我的编码如下

int main(){
int numbers[5] = {2,10,20,60,40},search = 60,i=0;

for(i=0;i<=5;i++){
    printf("%d ",numbers[i]);
     if(numbers[i]==search){
       printf("Index[%d] : Found\n",i);
       //break;
     }else{
       printf("Index[%d] : Not Found\n",i);
     }
 }
 return 0;
}

如果我没有使用中断条件并且我保持 i<= 5 ,它比数组大小大。对于 i=3 和 i=5,我得到输出 "Found"。请看下图

我的问题是关于 i=5 的,为什么我得到 "Found"。为什么不是 "garbage value " ?

主要问题是由于 i<=5,您正在越界访问数组。此检查允许 i5,但使用 的数组索引从 0 开始到 size-1。所以最大允许索引是 4.

#include <stdio.h>

int main(void)
{
    int numbers[] = { 2, 10, 20, 60, 40 };
    int search = 60;

    for (size_t i = 0; i < sizeof(numbers)/sizeof(numbers[0]); i++)
    {
        printf("%d ", numbers[i]);

        if (numbers[i] == search)
        {
            printf("Index[%zu] : Found\n", i);
            //break;
        }
        else
        {
            printf("Index[%zu] : Not Found\n", i);
        }
    }
    return 0;
}

如您所见,我还使用 sizeof(numbers)/sizeof(numbers[0]); 更改了 for,如果您更改它,该代码将自动调整循环以适应数组的实际大小。

最后我更改了 i 类型,因为 sizeof return 类型是 size_t:[=24= 的正确 printf 格式格式说明符] 类型是 %zu

编辑

试图解释为什么在这种特定情况下打印 "Found",我们可以看到变量是如何分配的

-----------------------------------------------------------------
| array[0] | array[1] | array[2] | array[3] | array[4] | search |
-----------------------------------------------------------------
                                                            ^
                                                            |
                                                            ------------
                                                            | array[5] |
                                                            ------------

所以当你访问array[5]时,你实际上是在访问search变量的值,即60。所以

if(numbers[i]==search)

可以看作

if(search==search)

那显然是true.