2016-07-03 4 views
-2

この関数を使って配列を検索しても機能しませんでした。配列を渡すことと何らかの関係があると思いました。だから私は別のものを試していた。配列へのポインタを作成するだけで作業が始まりましたが、何もしませんでした。それはなぜですか?あなたがバインドされたアクセスのうち配列であるarr[size+1]にアクセスしようとしたところ配列検索はポインタを作成するだけで動作します

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

です。これによりundefined behaviorが呼び出されます。サイズnを有するアレイ、arr[n]に有効に結合されたアクセスの外にもあるよう

FWIW、Cは、アレイの0ベースのインデックスを使用します。有効なアクセスは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)。 –

関連する問題