一.代码描述以及错误描述
#include <stdio.h>
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 \n");
}
return 0;
}
代码描述:创建一个数组,里面存储类10个数,然后循环遍历将数组中的每个元素赋值为零,每次赋值一个元素,就打印一个hello。
错误描述:以下为运行结果(陷入死循环,一直打印输出hello),和错误提示:变量 “ ” 周围的堆栈已损坏。
![在这里插入图片描述](https://img-blog.csdnimg.cn/6b230e7617f24760bf23eb57c6e7a81f.png
二.解决方法和原因剖析
解决方法: !!!规范自己写循环的条件和表达式,做到不在数组当中不越界。!!!
原因:1.在栈当中,存储局部变量,存储习惯为从高到低;而数组当中,存储习惯为随着下标的增大,从低到高进行存储。2.在不同的编译环境中局部变量与数组的空间位置间隔举例不同。
什么叫做栈,静态区和堆
C语言拥有三种不同的内存池。
调试观看结果
我们可以看到,即使数组中只有是个数子但是,再执行循环的时候仍然越过了数组的界限,进入了死循环。
为什么在越过界限的时候,编译器不能报出错误呢?
因为这个时候编译器在进入了死循环,所以不能及时报出错误。
三总结
编程的学习,不仅仅要学会写出自己想要的结果,还要学会调试代码,在空间和时间上达到最优的结果。一般在学习代码的过程中会遇见三种错误,编译错误,链接错误,运行错误。当遇见错误时,不要慌先进行分类,在慢慢解决,我们遇见的错误,不要想着靠别人解决,不然我们的技术不会有任何的增长。