文件指针在函数间传递时 其值丢失的问题


如题 ,我定义了几个函数,在函数间传递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 个解决方案

#1


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. 

#2


调试我是会的,就是在第二个红色的地方我查看了file的值,其值还存在,当进入该函数后,参数file的值就变了,导致后面的操作都出现异常

#3


void __cdecl _lock_file (

        FILE *pf
        )
{
        /*
         * The way the FILE (pointed to by pf) is locked depends on whether
         * it is part of _iob[] or not
         */
        if ( (pf >= _iob) && (pf <= (&_iob[_IOB_ENTRIES-1])) )
        {
            /*
             * FILE lies in _iob[] so the lock lies in _locktable[].
             */
            _lock( _STREAM_LOCKS + (int)(pf - _iob) );
            /* We set _IOLOCKED to indicate we locked the stream */
            pf->_flag |= _IOLOCKED;
        }
        else
            /*
             * Not part of _iob[]. Therefore, *pf is a _FILEX and the
             * lock field of the struct is an initialized critical
             * section.
             */
            EnterCriticalSection( &(((_FILEX *)pf)->lock) );
}
就是在这个地方出现了异常
我发现异常是因为file的值改变了的原因 
但是在运行到上面第二个红色的地方的时候,file的值还有,然后设置file值改变的断点,点运行,就直接出现异常,单步走得时候发现在这里一进入第二个红色的地方的时候,进入调用的函数时,file值就变了,哪个知道是怎么回事啊,帮帮忙啊
我在新的工程里测试FILE指针的传递,在函数间传递,都没有出现上面的状况

#4


有没有人遇到相同的问题啊

#5


在“file值改变断点”命中的时候,按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码处。

#6


十有八九getRollWeakSum函数里面有对局部变量、局部数组变量、局部指针变量……越界或非法修改覆盖了file变量。

#7


如果是我,就把file定义为全局变量而不在函数参数中传来传去了。

#8


把file设成static试试。

#9


谢谢大家的意见哈 是我马虎造成的 后来看汇编代码和内存的变化 才发现寄存器压入栈的时候,调用的函数本来只有三个参数,而我传了四个参数,所以在进入调用的函数体里面的时候,我的file指针被赋值为传进来的第三个参数而非我想要的file指针,而是个ws->length整数型的变量,这就使file指针变化了。

#10


引用 9 楼 t_p_w_w 的回复:
谢谢大家的意见哈 是我马虎造成的 后来看汇编代码和内存的变化 才发现寄存器压入栈的时候,调用的函数本来只有三个参数,而我传了四个参数,所以在进入调用的函数体里面的时候,我的file指针被赋值为传进来的第三个参数而非我想要的file指针,而是个ws->length整数型的变量,这就使file指针变化了。

参数个数不对编译竟然不出错?
智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告