Я не ставил точки останова. Моя основная программа контролирует получение входных данных, а затем выполняет проверку. Первый ввод в порядке, но после проверки содержимого одного ввода вторая проверка перейдет в режим точки останова. Программа прерывает предложение, показанное на картинке. Затем мне нужно нажать «Продолжить» два или три раза, чтобы продолжить нормальное выполнение программы. Я хочу спросить, почему это происходит?
Код вызова функции с точкой останова в основной программе:
/* Verify whether the entered value is each value between 1 and max_value */
while(checkForDuplicationForNums(key, key_length_m) /* Check whether the entered value is repeated */
|| checkElemExceedsMax(key, key_length_m)
|| checkNumWithinMaxNotAppear(key, key_length_m)) {
illegalInputPrompt();
getInputNumArrayByGetchHaveSpaces(key_string, key);
}
Фрагмент кода для возникновения точки останова:
int checkForDuplicationForNums(int nums[], int max_value){
int* within_max_value = (int *)calloc(max_value, sizeof(int));
for(int i=0; i<max_value; i++) {
/* nums : 0~m-1 */
within_max_value[nums[i]]++;
}
for(int i=0; i<max_value; i++) {
if (within_max_value[i] > 1) {
return 1;
}
}
free(within_max_value);
return 0;
}
Расположение странной точки останова:
free(within_max_value);
Во время работы программы max_value всегда равно 11.
Первый ввод делает числа:
int nums[11] = {0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9};
Второй ввод делает числа:
int nums[11] = {0, 11, 2, 3, 4, 5, 6, 7, 8, 9, 10};
Потом программа ломается. nums[1] превышает диапазон значений моего ожидаемого входного значения: 1~11.





Во второй итерации цикла второго вызова функции строка
within_max_value[nums[i]]++;
пишет в массив within_max_value за пределы.
Согласно информации, предоставленной в вашем вопросе, во втором вызове функции num[1] будет иметь значение 11. Это означает, что линия
within_max_value[nums[i]]++;
эквивалентно
within_max_value[11]++;
во второй итерации цикла второго вызова функции.
Это выражение обращается к массиву within_max_value за пределами границ, потому что действительные индексы 0 до 10 включительно. Индекс 11 выходит за пределы.
Записывая в массив за пределами границ, вы, вероятно, повреждаете память кучи, что приводит к тому, что следующий вызов free генерирует исключение, из-за чего отладчик останавливается на этой строке.
@goon: я рад, что смог помочь. Теперь я адаптировал свой ответ к вашему обновленному вопросу.
Я уже видел~ Еще раз спасибо :) @Andreas Wenzel
Мне жаль, что массив nums, который я предоставил, неверен. Получение входного значения nums из cmd точно так же, как описано в описании задачи, но до того, как массив nums будет передан в функцию, его значение было обработано с -1, что означает, что nums равно
int nums[11] = {0, 11, 2, 3, 4, 5, 6, 7, 8, 9, 10};Но ваш ответ правильный. Я проверил и обнаружил, что значение 11 nums [1] выходит за пределы диапазона,within_max_value[11]++;вызывая описанное вами исключение. Большое спасибо! Спасибо за ваше терпение, которое согревает меня.