文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>检测数组越界时出现的一个问题

检测数组越界时出现的一个问题

时间:2010-11-07  来源:剑子与剑痴

  自己写的一段用于检测数组越界下的代码,VC6环境下运行,编译通过,但结果令人非常不解:   原代码:  

#include<stdio.h>
#include<string.h>

void main()
{
    int x=35; //栈区中分配局部变量地址向低地址端
    char str[10];
    strcpy(str,"www.it315.org\n"); //共14个字母,数组中 "www.it315." 这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,"www.it315.org\n"); 时,www.it315.org里的字符写进数组里,而越界的"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的值时只输出了前两字节的内容,后面两字节被丢弃。

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

如有高手看到,随便解答下,不胜感激

相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载