首先我请你来分析一下这段C语言代码的运行结果:
你发现问题叻吗?这段代码的运行结果并非是打印三行“hello word”而是会无限打印“hello world”,这是为什么呢
因为,数组大小为3a[0],a[1]a[2],而我们的代码因为书寫错误导致for循环的结束条件错写为了i<=3而非i<3,所以当i=3时数组a[3]访问越界。
我们知道在C语言中,只要不是访问受限的内存所有的内存空間都是可以自由访问的。根据我们前面讲的数组寻址公式a[3]也会被定位到某块不属于数组的内存地址上,而这个地址正好是存储变量i的内存地址那么a[3]=0就相当于i=0,所以就会导致代码无限循环
问题点在于:a[3]也会被定位到某块不属于数组的内存地址上,而这个地址正好是存储變量i的内存地址那么a[3]=0就相当于i=0。
为什么就无限循环了为什么a[3] = 0 时,就相当于i=0就无限循环了呢?
函数体内的局部变量存在栈上且是连續压栈。在Linux进程的内存布局中栈区在高地址空间,从高向低增长变量i和arr在相邻地址,且i比arr的地址大所以arr越界正好访问到i。当然前提是i和arr元素同类型,否则那段代码仍是未决行为
栈是由高到低位增长的,所以i和数组的数据从高位地址到低位地址依次是:i, a[2], a[1], a[0]。a[3]通过寻址公式计算得到地址正好是i的存储地址,所以a[3]=0就相当于i=0.
紫色部分,目前还是有疑问尚待解决