我来我网
https://5come5.cn
 
您尚未 登录  注册 | 菠菜 | 软件站 | 音乐站 | 邮箱1 | 邮箱2 | 风格选择 | 更多 » 
 

« 1 2» Pages: ( 1/2 total )
本页主题: 一个关于内存空间的问题 隐藏签名 | 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

lxlcn



性别: 帅哥 状态: 该用户目前不在线
等级: 鹤立鸡群
发贴: 1310
威望: 0
浮云: 1741
在线等级:
注册时间: 2005-10-06
最后登陆: 2011-06-29

5come5帮你背单词 [ tributary /'tribjutəri/ a. 附庸的,从属的,辅助的,支流的 ]


一个关于内存空间的问题

今天帮个同学改个东西..突然出现个问题,求达人指点下..
    附件里边的关键代码如下:
Copy code
//就是按下OK按钮发生的事件
//分配一个空间->将一段字符串复制进去->计算检验和->释放空间
void CAddressQDlg::OnOK()
{

    //char *buff=new char[strlen("AT+SSCAN,*")+5];
    char *buff=new char[63];//我的机器上少于63就会报错 
    if(!buff) return;
    strcpy(buff,"AT+SSCAN,*");
    checkSum(buff,strlen(buff)+1);
                      //sendDataFunction(buff,strle(buff+1));
    delete []buff;
    //CDialog::OnOK();
}
//同学写的检验函数
char * CAddressQDlg::checkSum(char *str,int length)
{
    char p,q;               
    char k='\r';
    char j='\n';
    char *temp;
    temp=str;
    temp=temp+2;
    for(p=*(temp+1);*(temp+1)!='*';temp++)
      p=p^*(temp+1);
    q=p;
    p=p&(char)15;
    q=(q&(char)(15<<4));
    strcat(str,&q);
    strcat(str,&p);
    strcat(str,&k);
    strcat(str,&j);
    return str;
}

问题的关键就出在第一句...
Copy code
char *buff=new char[strlen("AT+SSCAN,*")+5]

这句分配出来的空间居然不够..然后发现不分配大于等于63的char空间都会出错,真的不明白..


[ 此帖被lxlcn在2007-12-25 21:58重新编辑 ]
附件: addressQ.rar (26 K) 下载次数:7

顶端 Posted: 2007-12-25 21:22 | [楼 主]
勇者归来



性别: 帅哥 状态: 该用户目前不在线
头衔: 科大勇恒回忆
等级: 荣誉会员
家族: YD一族
发贴: 4890
威望: 0
浮云: 384
在线等级:
注册时间: 2007-10-16
最后登陆: 2011-06-27

5come5帮你背单词 [ continual /kən'tinjuəl/ a. 不停的,频频的 ]


没看出名堂哈
勇敢,勇气,勇往直前,勇不言弃,勇者归来
顶端 Posted: 2007-12-25 21:41 | [1 楼]
第二个太阳



性别: 帅哥 状态: 该用户目前不在线
头衔: 我要鸡蛋
等级: 前途无量
发贴: 5594
威望: 1
浮云: 1676
在线等级:
注册时间: 2004-11-26
最后登陆: 2008-06-29

5come5帮你背单词 [ witch // n. 女巫 ]


Copy code
p=p^*(temp+1);

这个得行麦
看得怎么样了? 看完了,不过不懂。     。。。程序已经帮你调好了,拷回去跑3组参数,其他的我跑。 哦,那岂不是我啥都没做? 那你就改点什么,不要改错了就行。
顶端 Posted: 2007-12-25 21:50 | [2 楼]
lxlcn



性别: 帅哥 状态: 该用户目前不在线
等级: 鹤立鸡群
发贴: 1310
威望: 0
浮云: 1741
在线等级:
注册时间: 2005-10-06
最后登陆: 2011-06-29

5come5帮你背单词 [ tiger /'taigə/ n. 虎 ]


Quote:
引用第2楼第二个太阳于2007-12-25 21:50发表的  :
Copy code
p=p^*(temp+1);

这个得行麦

还行吧,反正也不是我写的..
这个不是问题的关键吧?
顶端 Posted: 2007-12-25 21:56 | [3 楼]
lxlcn



性别: 帅哥 状态: 该用户目前不在线
等级: 鹤立鸡群
发贴: 1310
威望: 0
浮云: 1741
在线等级:
注册时间: 2005-10-06
最后登陆: 2011-06-29

5come5帮你背单词 [ liberal /'libərəl/ a. 自由主义的,大记的,慷慨的,心胸开阔的,开明的 ]


Quote:
引用第1楼勇者归来于2007-12-25 21:41发表的  :
没看出名堂哈

我也不明白..
顶端 Posted: 2007-12-25 21:58 | [4 楼]
依然随意



性别: 帅哥 状态: 该用户目前不在线
等级: 前途无量
家族: ⊙JAY菊爱园⊙
发贴: 5922
威望: 0
浮云: 760
在线等级:
注册时间: 2006-09-25
最后登陆: 2022-10-30

5come5帮你背单词 [ temporary /'tempərəri/ a. 暂时地,临时的 ]


老大,如果buff长度过小的话缓冲区要溢出。
顶端 Posted: 2007-12-25 22:19 | [5 楼]
依然随意



性别: 帅哥 状态: 该用户目前不在线
等级: 前途无量
家族: ⊙JAY菊爱园⊙
发贴: 5922
威望: 0
浮云: 760
在线等级:
注册时间: 2006-09-25
最后登陆: 2022-10-30

5come5帮你背单词 [ porter /'po:tə/ n. 搬运工人 ]


    strcat(str,&q);
    strcat(str,&p);
    strcat(str,&k);
    strcat(str,&j);
这一类函数是专gate搞缓冲区溢出的,如果str串空间过小,上面这几个函数将会将checkSum函数返回地址冲刷掉,
顶端 Posted: 2007-12-25 22:22 | [6 楼]
lxlcn



性别: 帅哥 状态: 该用户目前不在线
等级: 鹤立鸡群
发贴: 1310
威望: 0
浮云: 1741
在线等级:
注册时间: 2005-10-06
最后登陆: 2011-06-29

5come5帮你背单词 [ herself /hə:'self/ pron. 她自己,她本人 ]


Quote:
引用第6楼依然随意于2007-12-25 22:22发表的  :
    strcat(str,&q);
    strcat(str,&p);
    strcat(str,&k);
    strcat(str,&j);
这一类函数是专gate搞缓冲区溢出的

Buff不够大是明显的,但是我想问的就是为什么?..
顶端 Posted: 2007-12-25 22:25 | [7 楼]
依然随意



性别: 帅哥 状态: 该用户目前不在线
等级: 前途无量
家族: ⊙JAY菊爱园⊙
发贴: 5922
威望: 0
浮云: 760
在线等级:
注册时间: 2006-09-25
最后登陆: 2022-10-30

5come5帮你背单词 [ floor /flo:/ n. 地板,楼层 ]


Quote:
引用第7楼lxlcn于2007-12-25 22:25发表的  :

Buff不够大是明显的,但是我想问的就是为什么?..
strcpy(),strcat(),scanf()等一系列函数对参数实际长度都没有检查,而你的buff其实是在栈空间里分配的,单从地址上看,buff的地址与主函数的返回地址是相当靠近的
顶端 Posted: 2007-12-25 22:29 | [8 楼]
依然随意



性别: 帅哥 状态: 该用户目前不在线
等级: 前途无量
家族: ⊙JAY菊爱园⊙
发贴: 5922
威望: 0
浮云: 760
在线等级:
注册时间: 2006-09-25
最后登陆: 2022-10-30

5come5帮你背单词 [ bull /bul/ n. & a. 公牛(似的),雄性(的),大型(的),庞大物体(的) ]


比如在main函数中,申明一个数组char buff[2];那么堆栈内容是:
byte1  <-----------ebp
byte2(buff[1])
byte3 (buff[0]) <-----------esp
如果你用strcat函数,它可能将把byte1或更上面的给冲掉,那么函数就反不回去了
顶端 Posted: 2007-12-25 22:34 | [9 楼]
lxlcn



性别: 帅哥 状态: 该用户目前不在线
等级: 鹤立鸡群
发贴: 1310
威望: 0
浮云: 1741
在线等级:
注册时间: 2005-10-06
最后登陆: 2011-06-29

5come5帮你背单词 [ within /wi'ðin/ prep. & adv. 在…里面,在…范围以内;ad. 在里面 ]


Quote:
引用第8楼依然随意于2007-12-25 22:29发表的  :
strcpy(),strcat(),scanf()等一系列函数对参数实际长度都没有检查,而你的buff其实是在栈空间里分配的,单从地址上看,buff的地址与主函数的返回地址是相当靠近的


没有检查对分配由什么影响呢?
buff是在堆中分配的,不会很近吧?好像关系也不大吧?
顶端 Posted: 2007-12-25 22:38 | [10 楼]
依然随意



性别: 帅哥 状态: 该用户目前不在线
等级: 前途无量
家族: ⊙JAY菊爱园⊙
发贴: 5922
威望: 0
浮云: 760
在线等级:
注册时间: 2006-09-25
最后登陆: 2022-10-30

5come5帮你背单词 [ trunk /trΛŋk/ n. 树干,躯干,象鼻 ]


Quote:
引用第10楼lxlcn于2007-12-25 22:38发表的  :


没有检查对分配由什么影响呢?
buff是在堆中分配的,不会很近吧?好像关系也不大吧?
你可以做个试验。
顶端 Posted: 2007-12-25 22:39 | [11 楼]
lxlcn



性别: 帅哥 状态: 该用户目前不在线
等级: 鹤立鸡群
发贴: 1310
威望: 0
浮云: 1741
在线等级:
注册时间: 2005-10-06
最后登陆: 2011-06-29

5come5帮你背单词 [ sideway // ad. & a. 斜向一边(的),侧身(的) ]


Quote:
引用第11楼依然随意于2007-12-25 22:39发表的  :
你可以做个试验。

我机器给人用了。。。
等下我试一下。。
顶端 Posted: 2007-12-25 22:43 | [12 楼]
lxlcn



性别: 帅哥 状态: 该用户目前不在线
等级: 鹤立鸡群
发贴: 1310
威望: 0
浮云: 1741
在线等级:
注册时间: 2005-10-06
最后登陆: 2011-06-29

5come5帮你背单词 [ consitstent // a. 一致的,符合的,坚持的,相容的 ]


果然是strcat()得问题。。
顶端 Posted: 2007-12-25 22:59 | [13 楼]
浆果



性别: 帅哥 状态: 该用户目前不在线
等级: 栋梁之材
发贴: 906
威望: 0
浮云: 1039
在线等级:
注册时间: 2005-11-19
最后登陆: 2012-06-11

5come5帮你背单词 [ alternative /o:l'tə:nətiv/ a. 两者选一的,交替的;n. 两者选一,替换物,交替 ]


Copy code
    //问题出在这里
  //strcat会将q的地址里的值往str指向的地址复制(不止一个byte,遇到0为止)
    strcat(str,&q);
    strcat(str,&p);
    strcat(str,&k);
    strcat(str,&j);
    return str;
}
顶端 Posted: 2007-12-25 23:30 | [14 楼]
« 1 2» Pages: ( 1/2 total )
我来我网·5come5 Forum » 程序员之家

Total 0.036942(s) query 5, Time now is:07-11 18:08, Gzip enabled
Powered by PHPWind v5.3, Localized by 5come5 Tech Team, 黔ICP备16009856号