2017-10-29 12 views
-1

私はThomas H. CormenによってAlgorithms Unlockedを読んでいましたが、私はセンチネル線形検索のアルゴリズムに遭遇しましたが、少し違った方法で書きました。このコードは動作しますが、私は私のものではないメモリにアクセスしているので、アプローチが間違っているかどうかを知りたがっていますか?これは、センチネルリニア検索には間違ったアプローチですか?

CODE:

int lsearch (int a[5], int n) { 

    int i = 0; 

    a[5] = n; 

    while (a[i] != n) 
     i ++; 

    if (i == 5) 
     return -1; 

    return i; 
} 
+1

5の配列を渡すと、 'a [5]'は範囲外のアクセスです。だから、もしそれが大丈夫かどうかを尋ねるなら、あなたはすでに答えを知っているか、あなたは聞かないでしょう。 – StoryTeller

+0

@Doctor EI:あなたの配列に含まれていないメモリにアクセスしているので、そのようなコードは無効です。つまり、この点を分かれば、 'lsearch'を呼び出すクライアントがおそらく望みません、あるいは期待していない配列を変更しているときにあなたの懸念が正当だと言います。 –

答えて

0

あなたが所有していないメモリ位置の値を設定しています。配列の割り当てられたメモリの直後にあるメモリを上書きしています(これは境界外のアクセスです)。 aパラメータに渡された引数が6つの未満の要素を持っている場合は 、

0

をあなたのプログラムが実行されることがありますが、それは概念的には間違っている(とコンパイラと場所でセキュリティチェックに応じて、他の状況では動作しない場合があります) a[5]にアクセスすることは未定義の動作であり、多くの場合問題を引き起こします。 aの宣言が与えられているので、私はあなたが5要素の配列で関数を呼び出すと仮定しているので、コードは間違っています。

引数に6つ以上の要素がある場合、コードは機能します。しかしその場合:

  1. int a[5]というパラメータ宣言は誤解を招きます。
  2. 入力配列を変更する検索機能があると、呼び出し元が予期しないことがあります。
関連する問題