Chinaunix首页 | 论坛 | 博客
  • 博客访问: 40848
  • 博文数量: 12
  • 博客积分: 473
  • 博客等级: 下士
  • 技术积分: 90
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-05 22:17
文章分类
文章存档

2011年(3)

2010年(9)

分类: C/C++

2010-11-07 16:42:49

 
自己写的一段用于检测数组越界下的代码,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]); //输出字符串最后一个元素的地址
}


结果:

按运行结果来分析:

int型变量  x  占4字节单元 :1245053--1245050

char型数组str占10字节单元 :1245049--1245040(这里注意下,1245040为数组第一元素地址,1245049为数组最后一元素地址)

执行语句:strcpy(str,""); 时,里的字符写进数组里,而越界的"org\n"写到了变量x所占的内存区中:

结构如下图:

/********************************************************************

好,现在问题来了:

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) |
给主人留下些什么吧!~~