Я не устанавливал точку останова, но ввел точку останова. Я использовал vscode для отладки программы

Я не ставил точки останова. Моя основная программа контролирует получение входных данных, а затем выполняет проверку. Первый ввод в порядке, но после проверки содержимого одного ввода вторая проверка перейдет в режим точки останова. Программа прерывает предложение, показанное на картинке. Затем мне нужно нажать «Продолжить» два или три раза, чтобы продолжить нормальное выполнение программы. Я хочу спросить, почему это происходит?

Без брейкпоинтов

Код вызова функции с точкой останова в основной программе:

  /* 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.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Во второй итерации цикла второго вызова функции строка

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 генерирует исключение, из-за чего отладчик останавливается на этой строке.

Мне жаль, что массив 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]++; вызывая описанное вами исключение. Большое спасибо! Спасибо за ваше терпение, которое согревает меня.

goon 03.12.2022 05:09

@goon: я рад, что смог помочь. Теперь я адаптировал свой ответ к вашему обновленному вопросу.

Andreas Wenzel 03.12.2022 05:21

Я уже видел~ Еще раз спасибо :) @Andreas Wenzel

goon 04.12.2022 08:19

Другие вопросы по теме