我没有设置断点而是输入了断点,我使用vscode调试程序

icomxhvb  于 2022-12-11  发布在  Vscode
关注(0)|答案(1)|浏览(155)

我没有设置断点,我的主程序控制输入的获取,然后进行验证,第一次输入是可以的,但是一次输入内容验证后,第二次验证就会进入断点模式,程序在图中所示的句子中中断,然后我需要点击两三次“继续”才能继续程序正常执行,我想问一下为什么会出现这种情况?
No breakpoints
主程序中调用带断点函数的代码:

/* 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);
Program execution effect
在程序运行期间,max_value始终为11。
第一个输入使nums:
int nums[11] = {0, 1, 1, 2, 3, 4, 5, 6, 7, 8, 9};
第二个输入使nums:
int nums[11] = {0, 11, 2, 3, 4, 5, 6, 7, 8, 9, 10};
然后程序breaking. nums[1]超出了我的预期输入值的值范围:1~11.

6tdlim6h

6tdlim6h1#

在第二个函数调用的第二次循环迭代中,

within_max_value[nums[i]]++;

正在写入数组within_max_value,超出界限。
根据您在问题中提供的信息,在第二次函数调用中,num[1]的值将为11

within_max_value[nums[i]]++;

相当于

within_max_value[11]++;

在第二函数调用的第二循环迭代中。
该表达式访问数组within_max_value时超出了范围,因为有效索引为010(包括10).索引11超出了范围.
写入数组超出界限时,可能会损坏堆内存,这会导致下一次调用free时生成异常,从而导致调试器在该行停止。

相关问题