看似简单的有关问题却要逼小弟我自杀

看似简单的问题却要逼我自杀
很久没用C了,今天朋友问了我一个问题,我却不知道原因。
非常简单的程序,却无法解决,哪有高人能指点迷津

环境:vc++ 2010
-----------------------------------------------
int _tmain(int argc, _TCHAR* argv[]){
int i;
char arr[5];

for(i=0;i<4;i++){
  printf("输入第%d个值",i);
  scanf("%d",&arr[i]);
  fflush(stdin);
}
arr[4]='\0';
printf("%s",arr);

puts("");
system("PAUSE");//pause
return 0;
}
-----------------------------------------------
目的就是输入10进制数字,打印出相应的ASCII码。
我分别输入103,111,111,100后,打印可以显示“good”,
可是程序结束时显示出错,显示“Run-Time Check Failure #2 - Stack around the variable 'arr' was corrupted”.
数组arr没有超出范围,为什么会发生这个问题呢?


 

------解决方案--------------------
数组越界了。

 scanf("%d",&arr[i]);

%d意味着输入的是一个4字节的int,修改的是arr+i到arr+i+3的4个字节,你看到没错只是因为高三位都是0而已。
当i=3时,覆盖的是arr[3]到arr[6],所以你只要把数组长度改为大于等于7就不会出错了。
------解决方案--------------------
数组arr
103: 0x67 00 00 00 cc
111: 0x67 6F 00 00 00
111: 0x67 6F 6F 00 00 00(越界)
100:0x67 6F 6F 64 00 00 00

为什么高三位是0就能显示?因为windows内存里就是这么存整数的,这叫低前高后,计算机组成原理里讲得很清楚