数组搜索只能用于制作指针

时间:2016-07-03 08:50:31

标签: c arrays pointers

所以我做了这个函数来搜索一个数组并且它不起作用,我认为它与传递数组有关。所以我尝试了不同的东西。当我只是简单地制作一个指向数组的指针时,它就开始工作了,我没有对它做任何事情,为什么会这样?

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);
    }
}

1 个答案:

答案 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]);

使得更强大。