我没有设置断点,我的主程序控制输入的获取,然后进行验证,第一次输入是可以的,但是一次输入内容验证后,第二次验证就会进入断点模式,程序在图中所示的句子中中断,然后我需要点击两三次“继续”才能继续程序正常执行,我想问一下为什么会出现这种情况?
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.
1条答案
按热度按时间6tdlim6h1#
在第二个函数调用的第二次循环迭代中,
正在写入数组
within_max_value
,超出界限。根据您在问题中提供的信息,在第二次函数调用中,
num[1]
的值将为11
。相当于
在第二函数调用的第二循环迭代中。
该表达式访问数组
within_max_value
时超出了范围,因为有效索引为0
到10
(包括10
).索引11
超出了范围.写入数组超出界限时,可能会损坏堆内存,这会导致下一次调用
free
时生成异常,从而导致调试器在该行停止。