赞
踩
本篇文章的所述重点是一段代码的解释。这段代码所表现的效果非常的有趣。相信各位看完本篇文章,会对相关知识点有更深刻的理解。
本文章的板书:板书(值得一看)
注:本篇使用的代码需在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,我们下一篇再见!!!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。