一段有趣的 C 语言代码

前言

本篇文章的所述重点是一段代码的解释。这段代码所表现的效果非常的有趣。相信各位看完本篇文章,会对相关知识点有更深刻的理解。

本文章的板书:板书(值得一看)

注:本篇使用的代码需在VS编辑器底下、X86环境、Debug模式下运行才会出现相应的效果。


我们这废话不多说,直接先上代码与产生的效果展示。

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 bit\n");
    }
    return 0;
}

我们运行代码就会出现上面的有效果,hello bit 一直循环打印。

按照我们对这段代码的理解,应该会造成数组的越界访问,从而导致此段代码会出现报错的提示。

那为什么会造成上面的死循环呢?

我们直接进如调试阶段。

根据代码的意思 for 循环一共循环13次,arr 数组的下标的范围0—12,于是监视窗口就会创建上述的内容。

经过上面的图片观察,我们可以看出 arr[12] 的值一直有变化,它的变化规律和变量 i 的变化规律一样。

于是我们就怀疑 arr[12] 的内存地址和 i 的内存地址会不会是一样的?

经过我们的调试观察发现 i 的地址和 arr[12] 的地址确实是一样的。

所以我们就知道出现死循环的原因了。

当 for 循环到 i = 12、arr[12] 的时候,根据赋值表达式,arr[12] 会被赋值成零 ,与他相同的地址 i 也变成零 ,然后程序往下执行打印 hello bit 之后进入到 for 循环的调整部分,i++ --->1<=12为真。for 循环又循环一次,代码会循环往复的执行。

根据前面我们所学的知识我们知道:

  • 局部变量是在栈区上开辟,而战区使用的规则是优先使用高地址处
  • 数组的创建排列是由低地址向高地址进行创建。

如下图所示: 

  • 一般程序执行的顺序是按照顺序结构执行的就从上往下执行。
  • 首先是i变量进行创建,根据上面的理论:栈区的地址首先是从高地址进行创建的。(例如下面黄色标的区域就是i创建的空间)。
  • 于是程序按照顺序往下执行,就会创建arr数组的空间(如图所示)。
  • 因为我们程序的for循环是一直到12,所以当我们的数组越界访问之后,第13次循环的时候,就会触碰到i的空间。此时数组arr[12]的地址空间与i的地址空间相重合,所以当arr[12]被赋值为0的时候,i的值也会随之变化。也就会形成死循环。

代码为什么没有因为越界访问而造成报错呢?

因为代码会去忙着死循环。

注:数组之间有两个整形间隔,纯属是巧合。整型与整型的间隔主要看编辑器。所以要完成本代码的调试需要严格的按照上面所描述的环境条件。

后语

希望各位在翻阅过本篇文章各位能够对 C 语言有更加深刻的认识。

希望能对各位有所帮助,如果各位有任何疑问,欢迎各位留言,我们可以进行友好的探讨与交流。

欢乐的时间总是过得特别快。又到时间讲bye,我们下一篇再见!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值