这个程序数组越界,但是结果是死循环;
(1)死循环的这种情况只会在debug--x86的版本才会出现,其他版本不会出现;这种情况会在特定的情况下发生,和环境有和大的关系,不同的编译器对于内存的分配管理是有区别的;
(2)我们要知道,实际上,在内存里面,对于局部变量,是放在内存的栈区,栈区会优先使用高地址,再使用低地址;
但是对于数组而言,随着下标的增加,数组元素的地址,是不但增加的,也就是,低下标低地址,高下标高地址;
(3)出现这样的结果原因:
如图所示,左边是debug版本,右边是release版本;
随着下标的增加,数组的元素地址变高,i和arr[9]之间有2个地址,恰好被arr[11]和arr[10]占用,arr[12]的地址和i的地址完全相同,arr[12]=0的时候,i的值也变成了0,又符合循环的条件,所以会出现死循环;
(4)但是在release版本里面,i会被放在低地址,数组元素放在高地址,但是数组元素随着下标的增加,地址还是增加的,但是越界之后就不可能会遇到i,由此可见,release版本里面,会对局部变量的存放做出相应的调整;
(5)归根结底,就是i的地址和arr[12]的地址完全相同而出现了死循环;
----------------------------------------------------------------------------------------------------------over