memcpy拷贝的数据长度过长会错误,并终止...char outBytes[255]= "541324933544636423653315643495232464743585054132493354463642365331564349523246474358505944573A524136535F4142545739543D9B8CC6A925EB7639CA823643997AECEC594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA85944573A524136535F4142545739543D9B8CC6A925EB7639CA823643997AECEC594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA8";
char ls_Data8[255] = {0};
memcpy(ls_Data8,&outBytes[72],sizeof(char)*strlen(outBytes)-72);
char ls_Data8[255] = {0};
memcpy(ls_Data8,&outBytes[72],sizeof(char)*strlen(outBytes)-72);
解决方案 »
- 紧急求助:MFC Tab Control 中的Edit Control问题 满分求助
- 请教有关VS 2005 运行的问题
- Outlook express不能收发126,qq,yahoo等等邮箱的邮件
- 学会了C++语言后如何上手VC++
- 要加入全局变量何函数,请高手指点
- InitInstance中new的对象在ExitInstance中不能正常的删除,请各位帮忙看一下.
- 高分求救:我想把CPropertySheet以视图的形式显示,请问如何实现?
- 用StretchBlt将图片缩小显示的问题
- 程序退出时有异常???(说该内存不能读!!!)
- 救命!!!我的switch...case为何不成功??????
- VC error LNK2005:代码错误!!!!!
- 一个DLL里面是否可以挂两个钩子?
你这何止255字节
int len=strlen(outBytes)-72;
char *ls_Data8=new char[len+1];
if(ls_Data8) {
memcpy(ls_Data8,&outBytes[72],len);
//..... 处理
delete[]ls_Data8;
}
char *outBytes= "541324933544636423653315643495232464743585054132493354463642365331564349523246474358505944573A524136535F4142545739543D9B8CC6A925EB7639CA823643997AECEC594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA85944573A524136535F4142545739543D9B8CC6A925EB7639CA823643997AECEC594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA8";
char ls_Data8[255] = {0};
int len=min(strlen(outBytes)-72,254);//防止strlen(outBytes)-72>255错误
memcpy(ls_Data8,&outBytes[72],len);
1.char *outBytes[255]= ...>255 已经错了
2.memcpy把>255的数据复制到ls_Data8[255]中又出错了
memcpy 没镜是你错了
char outBytes[]= "541324933544636423653315643495232464743585054132493354463642365331564349523246474358505944573A524136535F4142545739543D9B8CC6A925EB7639CA823643997AECEC594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA85944573A524136535F4142545739543D9B8CC6A925EB7639CA823643997AECEC594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA8";
char ls_Data8[255] = {0};
int nlen = strlen(&outBytes[72]);
if(nlen >= 255)
{
nlen = 254;
}
memcpy(ls_Data8, &outBytes[72], nlen);
而'\0'字符是char数组的结束标识,所以字符串的实际长度,是从起始地址一直到,其在栈内遇到的第一个'\0'字符。你把赋了初值的字符串的最后一个元素改为字符串结束标识'\0'可解决问题。
char outBytes[255]= "541324933544636423653315643495232464743585054132493354463642365331564349523246474358505944573A524136535F4142545739543D9B8CC6A925EB7639CA823643997AECEC594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA85944573A524136535F4142545739543D9B8CC6A925EB7639CA823643997AECEC594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA8";outBytes[254]='\0';//添加结束标识char ls_Data8[255] = {0};
memcpy(ls_Data8,&outBytes[72],sizeof(char)*strlen(outBytes)-72);
但有一点可以肯定的是,在outByte的栈底(更高地址处),是main函数的参数与main函数的返回值,如果改写了这些内容,在main函数的return的时候,就会报错.我写了个测试的.int main(int argc, char* argv[])
{
char outBytes[255]= "541324933544636423653315643495232464743585054132493354463642365331C594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA85944573A5241365328ED6836B573A524136532D6836B573A5241365328ED6836BE69EAB451F0E6843DB4823CAA8594457";
char ls_Data8[255] = {0};
int iLen = sizeof(char)*strlen(outBytes)-72;
int iLen2 = strlen(outBytes);
memcpy(ls_Data8,&outBytes[72],255*2+20);//ls_Data的地址加上255*2就到达main的参数处,再加上20,保证写乱main返回要用的地址,return时会报错. getchar();
return 0;
}
char *ls_Data8 = new char[sizeof(outBytes)];
memcpy(ls_Data8,&outBytes[72],sizeof(char)*strlen(outBytes)-72);这样就行了。楼主,内存越界啊