1

int find_pos(int item, int a[], int len)次のように機能する関数を作成しようとしています。

tの であるキーの配列のインデックスを返します。存在する場合は、そうでなければ return を返しsuccessorます。kKEY_NOT_FOUND

Keytは の後継でありk、がそのような にt格納されている最小のキーです。sda->buffert >= k

const int KEY_NOT_FOUND = -1;

int find_pos(int item, int a[], int len) {
 int low = 0;
 int high = len-1;
 if (a[0] >= item && len == 1) {
 return 0;
 }
 if(a[0] < item && len == 1) {
 return KEY_NOT_FOUND;
 }
 while (low <= high) {
 int mid = low + (high - low) / 2;
 if (a[mid] == item) {
  return mid;
 } else if (a[mid] < item) {
   low = mid + 1;
 } else {
   high = mid - 1;
 }
 if(a[high] < item) {// invalid size read of 4
  return high + 1;
 }
 }
 return KEY_NOT_FOUND;
}

ただし、無効な読み取りサイズ 4 の読み取りが発生する可能性があります。

if(a[high] < item)

この行が無効な読み取りサイズ 4 の読み取りを引き起こす理由を誰かが説明 (または例を挙げて) できますか? 前もって感謝します。

4

1 に答える 1

3

low == high == 0while ループの開始点としましょう。

そう、mid == 0

次に、コードはhigh = mid - 1;So になり、high今度は否定的になりa[high]、不正なアクセスになります。

于 2013-07-23T17:29:52.133 に答える