日常练习代码过程中,运行代码时编译器报错,如下图:
代码运行环境为:VS 2019
这段话翻译过来的意思是:运行时检查失败#2-变量“arr”周围的堆栈已损坏。
通过排查,了解到可能是数组“arr”变量可能存在堆栈溢出或内存访问越界的问题。
问题原因:
报错提示数组“arr”存在问题,再三检查之后发现问题出在for循环中的数组下标。
变量“i”进循环时,将“i”赋值为“1”,导致数组:“arr[i]”,第一次循环时下标为“1”,for循环10次,则下标对应为“1-10”。
而实际情况数组“arr[10]”的下标为“0-9”,导致了内存越界,报错的产生。
问题原因是数组里输入的字符超过了这个数组的范围,故导致了访问越界,报错的产生。编译器不会显示出此类问题,在代码运行过后才会发出一个警告。
遇到此类问题,如若存在数组变量,则需再三检查数组下标访问的合法性。
解决方案:
将代码:for (i = 1; i <= 10; i++)
for (i = 1; i <= 10; i++){scanf("%d", &arr[i]);}
更正为:for (i = 0; i <= 9; i++)
for (i = 0; i <= 9; i++){scanf("%d", &arr[i]);}
将数组arr[i],下标改为从“0”开始循环,循环10次之后,下标“i”还在数组arr[10]的合法范围内,报错随之消失。
更正代码后,报错问题随之解决。
粗浅理解,不足之处,望海涵!