这道题是之前nice公司在笔试的时候的一道题目,我感觉很有意思,就拿出来和大家讨论讨论。
![OZ]7Y21BAMZ@1{7EF7TJW2L.jpg](p6-juejin.byteimg.com/tos-cn-i-k3…)
这道题的考察点,我认为在以下几点:
1.栈空间的使用规则
2.数组下标递增,对应的地址由低到高变化
好了,那我们就开始来看这一道题目吧!
我们看到我们定义了一个循环因子i,和一个16个元素的长整形数组a,之后for循环,乍一看我们就发现了一个问题,就是数组越界访问了,数组内有16个元素,我们以下标方式检索的时候应该是从 0 ~ 15,而他却直接访问到了第17个元素。
这样会有什么问题呢?下面我们就详细分析一下。 我们知道栈空间的使用规则是,先使用高地址,后使用低地址,这样我们就能画出下面的图:
![IC1WG{S3OIK]P1I55X3O_VV.jpg](p6-juejin.byteimg.com/tos-cn-i-k3…)
中间这里预留的4个字节的空间是起一定的保护作用,这里的4个字节的空间,具体是由编译器来管理的 Linux x86_64 gcc环境下,是4个字节,Windows下VS2019下是8个字节。
之后,一个知识点,因为随着数组下标递增,对应的地址由低到高变化的,这样我们就能看到,当数组在一定情况下越界访问的时候,可能会修改掉先前创建的变量中的值。那么这道题目的的运行结果就不言而喻了,他是输出 0 ~ 16 的死循环,因为a[17] = 0,这条语句会修改掉i的值让i从0重新开始,这也就是为什么会出现死循环的原因了。