所以我做了这个函数来搜索一个数组并且它不起作用,我认为它与传递数组有关。所以我尝试了不同的东西。当我只是简单地制作一个指向数组的指针时,它就开始工作了,我没有对它做任何事情,为什么会这样?
void search(int a[],int n,int find);
int main(void){
int size;
int arr[]={345,767,232,45,768,2342,78,-89,-354,-234};
int *p=arr;
size=sizeof(arr)/sizeof(int);
search(arr[size+1],size,-89);
return 0;
}
void search(int a[],int len,int find){
int spot,i,FOUND;
spot=i=FOUND=0;
for(i=0;i<len;i++)
if (a[i]==find){
FOUND=1;
break;
}
if (FOUND==1){
printf("%d found at element %d\n",find, i);
}
else
printf("Number: %d \tNOT FOUND",find);
}
}
答案 0 :(得分:6)
此代码的基本问题在
中 search(arr[size+1],size,-89);
您尝试访问数组超出限制访问权限的arr[size+1]
。这会调用undefined behavior。
FWIW,C
对数组使用基于0的索引,因此对于大小为n
的数组,arr[n]
也实际上是超出绑定的访问权限。有效访问权限为arr[0]
到arr[n-1]
。
你应该只传递数组名arr
,当作为函数参数传递时,它会自动衰减到指向第一个元素的指针。
另一方面,当你做
时int *p=arr;
并传递p
,你有效地将指向数组的第一个元素的指针存储到p
,并将其传递给函数(这是预期的),因此它可以工作细
那就是说,只是一个建议,
size=sizeof(arr)/sizeof(int);
可以重写为
size=sizeof(arr)/sizeof(arr[0]);
使得更强大。