Вы разрешаете target_searcher
быть равным last_int
при поиске минимума. Таким образом, иногда вы получаете случайное небольшое значение, введенное в ваш массив (и связываетесь с памятью, которая вам не принадлежит). Конечно, я предполагаю, что last_int
- это длина массива.
Когда вы имеете дело с «только действительными индексами», диапазон составляет от 0
до len-1
. Вы можете увидеть это с массивом длины 1 (на случай, если у вас снова возникнут сомнения). Поскольку существует только 1 элемент, он находится на array[0]
или array[len-1]
.
Сказав это, обычно принято передавать параметры в виде массива и длины вместо массива и индекса последнего действительного элемента. Это более естественно. Скажем, у вас есть большой массив с двумя блоками len1
и len2
и функция, которая что-то делает с этими разделами. Если вы используете длину в качестве параметра, вы используете:
processBlock(arr, len1);
processBlock(arr + len1, len2);
Если бы вы использовали последний действительный индекс, были бы все эти +/-1
термины, с которыми вам пришлось бы иметь дело. Так что либо:
processBlockIdx(arr, len1 - 1);
processBlockIdx(arr + len1, len2 - 1);
или
processBlockIdx(arr, lastIdx1);
processBlockIdx(arr + lastIdx1 +1, lastIdx2 - lastIdx1 - 1);
Что касается ответа на ваш второй вопрос: да, проблема была вызвана доступом к элементу, который находится за пределами вашего массива. Поскольку C не имеет системы безопасности для проверки границ массива, такая ошибка обычно проявляется в том, что в ваших результатах появляется необъяснимое значение, или, что еще хуже, сбой приложения. В некоторых случаях вам не так повезло, и это проявляется в совершенно не связанной части вашей программы. Поэтому лучше всего очень быть уверенным в доступе к элементам массива.