memcpy拷贝的数据长度过长会错误,并终止...char outBytes[255]= "541324933544636423653315643495232464743585054132493354463642365331564349523246474358505944573A524136535F4142545739543D9B8CC6A925EB7639CA823643997AECEC594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA85944573A524136535F4142545739543D9B8CC6A925EB7639CA823643997AECEC594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA8";
char ls_Data8[255] = {0};

memcpy(ls_Data8,&outBytes[72],sizeof(char)*strlen(outBytes)-72);

解决方案 »

  1.   

    char outBytes[255]= "541324933544636423653315643495232464743585054132493354463642365331564349523246474358505944573A524136535F4142545739543D9B8CC6A925EB7639CA823643997AECEC594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA85944573A524136535F4142545739543D9B8CC6A925EB7639CA823643997AECEC594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA8";
    你这何止255字节
      

  2.   

    ls_Data8大小应该大一点吧memcpy(ls_Data8,outBytes+72,sizeof(char)*strlen(outBytes)-72);
      

  3.   

    char outBytes[]= "541324933544636423653315643495232464743585054132493354463642365331564349523246474358505944573A524136535F4142545739543D9B8CC6A925EB7639CA823643997AECEC594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA85944573A524136535F4142545739543D9B8CC6A925EB7639CA823643997AECEC594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA8";
    int len=strlen(outBytes)-72;
    char *ls_Data8=new char[len+1];
    if(ls_Data8) {
      memcpy(ls_Data8,&outBytes[72],len);
      //..... 处理
      delete[]ls_Data8;
    }
      

  4.   

    或者
    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 没镜是你错了
      

  5.   


    char outBytes[]= "541324933544636423653315643495232464743585054132493354463642365331564349523246474358505944573A524136535F4142545739543D9B8CC6A925EB7639CA823643997AECEC594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA85944573A524136535F4142545739543D9B8CC6A925EB7639CA823643997AECEC594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA8";
    char ls_Data8[255] = {0};

    int nlen = strlen(&outBytes[72]);
    if(nlen >= 255)
    {
    nlen = 254;
    }
    memcpy(ls_Data8, &outBytes[72], nlen);
      

  6.   

    出错分析:char数组,初始化字符串长度大于申请长度时,不会在末尾加'\0'字符。
    而'\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);
      

  7.   

    楼主,我测过了,是strlen 的问题,赋值的时候,特意把前面 255 的数组全部写上了数据,最后outByte[254]也是数据,而没有0,strlen是从头开始找,直到找到0为止.结果他就往栈的高字节(栈底)一直找数据,直到找到有0字节为止.结果长度并不是我们的255的长度.会比255长一些.在我这里,是259.结果就导致了多复制了一些东西了.我像楼主那样,写一个超出255长度的数据赋给outByte编译不过.
    但有一点可以肯定的是,在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;
    }
      

  8.   

    char outBytes[]= "541324933544636423653315643495232464743585054132493354463642365331564349523246474358505944573A524136535F4142545739543D9B8CC6A925EB7639CA823643997AECEC594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA85944573A524136535F4142545739543D9B8CC6A925EB7639CA823643997AECEC594ADB7EF2DF8D25E48D3228B49242D0BA6363E7B453D264CB6E2728ED6836BE69EAB451F0E6843DB4823CAA8";
    char *ls_Data8 = new char[sizeof(outBytes)];
    memcpy(ls_Data8,&outBytes[72],sizeof(char)*strlen(outBytes)-72);这样就行了。楼主,内存越界啊
      

  9.   

    memcpy我还在学习,努力看帖学习!再跟帖!
      

  10.   

    用指针不行么,在cpy之前先得到源数据的长度,然后自己动态申请啊