首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

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

2013-04-21 
看似简单的问题却要逼我自杀很久没用C了,今天朋友问了我一个问题,我却不知道原因。非常简单的程序,却无法解

看似简单的问题却要逼我自杀
很久没用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内存里就是这么存整数的,这叫低前高后,计算机组成原理里讲得很清楚

热点排行