一、bug
有如下代码:
int main() {
int i = 0;
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (i = 0;i <= 12;i++) {
printf("hehe\n");
arr[i] = 0;
}
return 0;
}
按正常思路,该代码会打印13个hehe,并把arr数组里的10个元素改为0,但为什么计算机会死循环打印无数个hehe?
二、原因分析
简述:数组越界,导致在for循环中执行到arr[12]=0时,把 i 重新赋值为0,所以继续循环,这与数据的存储方式有关
局部变量存储在栈区,栈区以压栈的方式存储,先存高地址,再存低地址。
我们在定义int i 时,i 以高地址存在内存中,之后空了两个整形位(与编译器的种类有关),然后再预留10个整形位存储数组
arr,数组内部存储由低地址到高地址。
所以死循环的核心原因是:arr[12]的地址就是i的地址
三、解决方法
通过限制条件阻止数组越界
四、release和debug版本
1.release版本是代码的发布版本,主要是为用户使用,不具有调试功能,占用的内存小
2.debug版本是代码的调试版本,主要是为程序员调试用,占用的内存大
对于该bug,通过实践可得,release版本会进行优化,改变arr和i在内存中的位置,所以不会像debug版本一样死循环
标签:arr,数组,int,存储,越界,地址,版本,死循环 From: https://blog.51cto.com/u_16102535/6534565