2 xy83138 xy83138 于 2016.05.06 21:05 提问

急!!!!!!!!!!!C++中关于strcat()函数占用其他变量内存地址的问题?

源代码有点长,我就只贴关键部分了!

 int main(){

   /省略部分代码。。。。/
    LinearList *L=(LinearList *)malloc(sizeof(LinearList));
    InitList(L,MAX);
    while(1){
    printf("Input file:");
    gets(filename);    //用get函数,避免scanf以空格分割数据,
    if (filename[0]==34) filename[strlen(filename)-1]=0,strcpy(filename,filename+1);  //支持文件拖曳,但会多出双引号,这里是处理多余的双引号
    if (!strcmp(filename,"exit")) exit(0);  //输入exit退出
    if (!(fp=fopen(filename,"rb"))) {printf("Can not open this file!\n");continue;}  //以二进制打开文件
    fseek(fp, 0, SEEK_END);  //文件指针转到文件末尾
    if((len=ftell(fp))==-1) {printf("Sorry! Can not calculate files which larger than 2 GB!\n");fclose(fp);continue;}  //ftell函数返回long,最大为2GB,超出返回-1
    rewind(fp);  //文件指针复位到文件头
    A=0x67452301,B=0xefcdab89,C=0x98badcfe,D=0x10325476; //初始化链接变量
    flen[1]=len/0x20000000;     //flen单位是bit
    flen[0]=(len%0x20000000)*8;
    memset(x,0,64);   //初始化x数组为0
    fread(&x,4,16,fp);  //以4字节为一组,读取16组数据
    for(i=0;i<len/64;i++){    //循环运算直至文件结束
      md5();
      memset(x,0,64);
      fread(&x,4,16,fp);
    }
    ((char*)x)[len%64]=128;  //文件结束补1,补0操作,128二进制即10000000
    if(len%64>55) md5(),memset(x,0,64);
    memcpy(x+14,flen,8);    //文件末尾加入原文件的bit长度
    md5();
    fclose(fp);

    char str1[8];
    sprintf(str1,"%08x",PP(A));
    char *s1=str1;
    char str2[8];
    sprintf(str2,"%08x",PP(B));
    char *s2=str2;
    char str3[8];
    sprintf(str3,"%08x",PP(C));
    char *s3=str3;
    char str4[8];
    sprintf(str4,"%08x",PP(D));
    char *s4=str4;
    strcat(str1,str2);
    strcat(str1,str3);
    strcat(str1,str4);
    cout<<str1<<endl;
    char *p=str1;
    node x(p,filename);
    InsertElem(L,x);
  }
    Printout(L);
    return 0;
}

然后问题是这样的:
通过调试发现:我在while循环外面定义和初始化了变量L之后,L的相关成员变量都有了内存地址。结果当运行完strcat(str1,str2)之后,奇怪的是L变量的内存地址突然变了,导致它所有的成员变量都没有有效内存地址。接下来,任何需要传入L作为参数的函数都没有办法运行,报错。
请问:这是怎么一回事啊???解决办法是????或者我通过其他方法把str1、str2、str3连接起来????

1个回答

caozhy
caozhy   Ds   Rxr 2016.05.06 23:31
已采纳

你分配的内存不够,字符串需要的大小是长度+1,因为还有一个结束符也需要1个元素。

xy83138
xy83138 感谢。这么简单的问题,我搞忘了。。。
一年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!