如题 ,我定义了几个函数,在函数间传递FILE指针,对文件进行只读操作,前面运行的时候一切正常,当运行到后面的时候文件指针在传递的时候丢失值。
附代码:
static void match_weak_sum(uint32 adler, struct fileStruct *fs, lpWeakSum ws, FILE *file, FILE *delta)
{
uint32 idx;
idx = hash_search(adler);//得到的是块的序号。
if(idx != 0xffffffff) //找到可能匹配的块
{
uchar compare = 0;
do{
if(adler == (fs->chunks+idx)->sum1)
{
compare = 1;
if(match_md5(ws,file,fs))
{
printf("%d to %d is not in the source file\n",ws->firstDiffOffset,ws->offset - ws->blockLen - ws->readLen);
adler = 0;
adler = adler32(adler,(ws->buff) +(ws->length - ws->readLen), (ws->readLen));
ws->length = readToBuff(file, ws->buff);
ws->flag = 0;
ws->firstDiffOffset = ws->offset-ws->readLen;
if(ws->length)
{
adler = getRollWeakSum(ws,adler,file);
match_weak_sum(adler,fs,ws,file,delta);
}
}
else
{
adler = 0;
ws->flag = 1;
adler = getRollWeakSum(ws,adler,file);
match_weak_sum(adler,fs,ws,file,delta);
}
break;
}
else
{
idx = fs->chunks[idx].chain;
}
}while(fs->chunks[idx].chain != 0xffffffff);
if(!compare)
{
//未找到匹配的块,滑动一个窗口大小的位置比较下一个块。并写入差异信息。
adler = 0;
ws->flag = 1;
adler = getRollWeakSum(ws,adler,file);
match_weak_sum(adler,fs,ws,file,delta);
}
}
else
{
//未找到匹配的块,滑动一个窗口大小的位置比较下一个块。并写入差异信息。
adler = 0;
ws->flag = 1;
adler = getRollWeakSum(ws,adler,ws->length,file);
match_weak_sum(adler,fs,ws,file,delta);
}
}
在标红色的地方,第一个地方其file值还有,到了第二个的时候file值就变为0x800了,不知道有没有人遇到过同样的问题没有,在网上找了很久,有的说是要将代码生成设为 mdd,依然不行,求各位大侠能帮帮忙看看这是什么情况?
10 个解决方案
Setting a Breakpoint When a Variable Changes Value
To set a breakpoint when a variable changes value
From the Edit menu, click Breakpoints.
Click the Data tab of the Breakpoints dialog box.
In the Expression text box, type the name of the variable.
Click OK to set the breakpoint.
调试我是会的,就是在第二个红色的地方我查看了file的值,其值还存在,当进入该函数后,参数file的值就变了,导致后面的操作都出现异常
在“file值改变断点”命中的时候,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码处。
十有八九getRollWeakSum函数里面有对局部变量、局部数组变量、局部指针变量……越界或非法修改覆盖了file变量。
如果是我,就把file定义为全局变量而不在函数参数中传来传去了。
谢谢大家的意见哈 是我马虎造成的 后来看汇编代码和内存的变化 才发现寄存器压入栈的时候,调用的函数本来只有三个参数,而我传了四个参数,所以在进入调用的函数体里面的时候,我的file指针被赋值为传进来的第三个参数而非我想要的file指针,而是个ws->length整数型的变量,这就使file指针变化了。