自己写的一段用于检测数组越界下的代码,VC6环境下运行,编译通过,但结果令人非常不解:
#include<stdio.h> #include<string.h>
void main() { int x=35; //栈区中分配局部变量地址向低地址端 char str[10]; strcpy(str,"\n"); //共14个字母,数组中 "" 这10字符 //"org\n"越界写到x的内存区中
printf("sizeof(int)=%d",sizeof(int)); printf("\nx=%d",x); printf("\nstrlen(str)=%d\n",strlen(str));
printf("\n&x = %d",&x); //输出x的地址 printf("\n&str[9] = %d",&str[9]); //输出数组最后一个元素的地址 printf("\n&str[0] = %d\n",&str[0]); //输出数组第一个元素的地址
printf("\n 'o'=%d",'o'); //由于数组越界,这里是变量x的第四字节 printf("\n*(str+10)=%d",*(str+10)); printf("\n &str[10]=%d\n",&str[10]);
printf("\n 'r'=%d",'r'); //由于数组越界,这里是变量x的第三字节 printf("\n*(str+11)=%d",*(str+11)); printf("\n &str[11]=%d\n",&str[11]); printf("\n 'g'=%d",'g'); //由于数组越界,这里是变量x的第二字节 printf("\n*(str+12)=%d",*(str+12)); printf("\n &str[12]=%d\n",&str[12]);
printf("\n \\n=%d",'\n'); //由于数组越界,这里是变量x的第一字节 printf("\n*(str+13)=%d",*(str+13)); //输出字符串最后一个元素的值 printf("\n &str[13]=%d\n",&str[13]); //输出字符串最后一个元素的地址 }
|
结果:![](http://blogimg.chinaunix.net/blog/upfile2/101107160833.jpg)
按运行结果来分析:
int型变量 x 占4字节单元 :1245053--1245050
char型数组str占10字节单元 :1245049--1245040(这里注意下,1245040为数组第一元素地址,1245049为数组最后一元素地址)
执行语句:strcpy(str,""); 时,里的字符写进数组里,而越界的"org\n"写到了变量x所占的内存区中:
结构如下图:![](http://blogimg.chinaunix.net/blog/upfile2/101107162925.jpg)
/********************************************************************
好,现在问题来了:
1.当输出x的地址时,程序输出的是:124502(字符'g'),而不是1245053(字符'\n');
2.当我输出x的值时,结果为:2663,其所对应2进制为:0000 1010 1011 0111 ;
注意到:
\n' ASCII为;10,换成2进制;0000 1010 ;
'g' ASCII为103,换成2进制;1011 0111 ;
也就是说:输出X的值时只输出了前两字节的内容,后面两字节被丢弃。
*******************************************************************/
如有高手看到,随便解答下,不胜感激
阅读(1116) | 评论(0) | 转发(0) |