在代码块中获取垃圾值作为我的搜索值 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
,您正在越界访问数组。此检查允许 i
为 5
,但使用 c 的数组索引从 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
.
我正在 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
,您正在越界访问数组。此检查允许 i
为 5
,但使用 c 的数组索引从 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
.