下面的程式的輸出結構為死迴圈,著重分析一下原因
#include<stdio.h>
int main(){
int i=1;
int arr[10]={1,2,3,4,5,6,7,8,9,10};
for(i=1;i<=12;i++){
printf("haha\n");
arr[i]=0;
}
return 0;
![除錯結果分析](https://img-blog.csdnimg.cn/2020120823165615.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW94aWEzODMyNA==,size_16,color_FFFFFF,t_70#pic_center)
![棧區記憶體分析](https://img-blog.csdnimg.cn/20201208232559273.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW94aWEzODMyNA==,size_16,color_FFFFFF,t_70#pic_center)
在分析之前我們要知道以下知識
1、可以理解記憶體是一塊大的區域,該區域可分為靜態方法區,堆區和棧區,區域性變數的相關運算在棧區中進行
2、棧區可分為高地址記憶體和低地址記憶體,變數的存放基本遵從自上而下即從高地址到低地址的存放順序
3、陣列下標增長,地址由低到高
經過除錯我們可以發現每次到arr[12]時,i會再次歸零,所以程式會死迴圈,一直執行下去。
不同的編譯器對越界的不同程度的處理時不一樣的,具體詳情可參考一些參考書,例如《C陷阱與缺陷》
下面的程式的輸出結構為死迴圈,著重分析一下原因
#include<stdio.h>
int main(){
int i=1;
int arr[10]={1,2,3,4,5,6,7,8,9,10};
for(i=1;i<=12;i++){
printf("haha\n");
arr[i]=0;
}
return 0;
}
![除錯結果分析](https://img-blog.csdnimg.cn/2020120823165615.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW94aWEzODMyNA==,size_16,color_FFFFFF,t_70#pic_center)
![棧區記憶體分析](https://img-blog.csdnimg.cn/20201208232559273.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3poYW94aWEzODMyNA==,size_16,color_FFFFFF,t_70#pic_center)
在分析之前我們要知道以下知識
1、可以理解記憶體是一塊大的區域,該區域可分為靜態方法區,堆區和棧區,區域性變數的相關運算在棧區中進行
2、棧區可分為高地址記憶體和低地址記憶體,變數的存放基本遵從自上而下即從高地址到低地址的存放順序
3、陣列下標增長,地址由低到高
經過除錯我們可以發現每次到arr[12]時,i會再次歸零,所以程式會死迴圈,一直執行下去。
不同的編譯器對越界的不同程度的處理時不一樣的,具體詳情可參考一些參考書,例如《C陷阱與缺陷》