2016-07-03 28 views
-2

所以我做了這個函數來搜索一個數組,並且它沒有工作,我想它與傳遞數組有關。所以我嘗試了不同的東西。它開始工作時,我只是簡單地製作一個指向數組的指針,我沒有做任何事情,爲什麼?數組搜索只適用於製作指針

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

此外,我必須在傳遞函數中添加'size + 1'才能使其工作,這是什麼原因? –

+0

請縮進您的代碼 –

+0

我之前被告知過,爲了讓它顯示爲代碼,我該如何縮進?抱歉,我是新來的Stackoverflow –

回答

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

做出更強勁。

+0

不客氣。你也可以[考慮接受幫助你的答案](http://meta.stackexchange.com/q/5234/244062)。 –