一、前言
程序能运行是个好迹象,但有时候也可能会出现运行错误。接下来应该检查程序是否按照你所设计的思路运行。你会发现你的程序中有一些错误,计算机行话叫 bug。查找并修复程序错误的过程叫调试。学习过程中不可避免会犯错,学习编程也是如此。因此,当你把所学的知识应用于编程时,最好为自己会犯错做好心理准备。随着你越来越老练,你所写的程序中的错误也会越来越少。
二、案例分析
下面这段代码是使用 for 循环将 arr 数组中的元素依次打印。仔细检查后,没有语法错误和逻辑错误。(此案例是在VS2022 编译器X86、Debug模式下运行,各编译器之间皆有差异)
#include <stdio.h>
int main()
{
int i = 0;
int arr[] = {1,2,3,4,5,6,7,8,9,10};
for(i=0; i<=12; i++)
{
arr[i] = 0;
printf("hello\n");
}
return 0;
}
但是运行后的结果是却是死循环打印 hello ,这是为什么呢?
这个问题只凭眼睛去看是看不出来原因的,这时候就要使用调试功能来找寻问题所在。
第一步:按快捷键 F10 打开编译器调试功能
第二步:在菜单栏找到调试-->窗口-->监视 并打开一个监视窗口
第三步:在监视窗口中输入要监视的整形变量 i 和 整型数组 arr 和 越界访问的arr[10]arr[11]arr[12] ,经过观察可以发现 arr[12] 的地址和整型变量 i 的地址是相同的,难道是数组越界访问通过修改 arr[12] 而导致 i 的值也被修改了吗?
第四步:继续按 F11 开始逐步调试,直到修改 arr[12] 的值为 0 时,果然 i 的值也被修改为 0 ,这样的话在 for 循环中 i 就永远无法大于 12 ,也就无法跳出循环,所以就形成了死循环。
三、总结
C语言为何会允许数组越界?这要归功于 C 信任程序员的原则。不检查边界,C 程序可以运行更快,编译器没必要捕获所有的下标错误,因为在程序运行之前,数组的下标值可能尚未确定。因此,为安全起见,编译器必须在运行时添加额外代码检查数组的每个下标值,这会降低程序的运行速度。C 相信程序员能编写出正确的代码,这样的程序运行速度更快。但并不是所有的程序员都能做到这一点,所以就出现了下标越界的问题。