源代码有点长,我就只贴关键部分了!
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连接起来????