C语言--测试和调试程序解释程序死循环

本文介绍了如何通过调试找出C语言程序中的数组越界问题,以及C语言为何允许这种行为以换取运行速度。作者强调了编程中不可避免的错误和调试过程的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、前言

程序能运行是个好迹象,但有时候也可能会出现运行错误。接下来应该检查程序是否按照你所设计的思路运行。你会发现你的程序中有一些错误,计算机行话叫 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 相信程序员能编写出正确的代码,这样的程序运行速度更快。但并不是所有的程序员都能做到这一点,所以就出现了下标越界的问题。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

腾扬集团驻吉吉国大使

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值