DaybreakTian 2016-05-06 13:05 采纳率: 83.3%
浏览 1256
已采纳

急!!!!!!!!!!!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条回答 默认 最新

  • threenewbee 2016-05-06 15:31
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥500 寻找一名机械工程师完成pcb主板设计(拒绝AI生成式答案)
  • ¥15 关于#mysql#的问题:UNION ALL(相关搜索:sql语句)
  • ¥15 matlab二位可视化能否针对不同数值范围分开分级?
  • ¥15 已经创建了模拟器但是不能用来运行app 怎么办😭自己搞两天了
  • ¥15 关于#极限编程#的问题,请各位专家解答!
  • ¥20 win11账户锁定时间设为0无法登录
  • ¥45 C#学生成绩管理系统
  • ¥30 matlab appdesigner私有函数嵌套整合
  • ¥15 vb6.0使用jmail接收smtp邮件并另存附件到D盘
  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标