被这个问题折腾到现在。和以前遇到过的都不一样。代码总是有非法指针问题,检查语法确都正常,一番艰苦的跟踪后,得到一个典型案例见图,对pConnSet->rClient用& 操作符取地址,在监视窗口看到的值是0x11f428。
定义变量recConn *p,赋值recConn *p=&pConnSet->rClient;结果看到0x11f434。相差12个字节。非常非常诧异,只是一个&操作符和=操作符号,都能得到不一样的值??!!!太奇妙了!!
使用p传值结果在iplogin函数里引起内存指针错误。使用&pConnSet->rClient传给iplogin也一样!证明得到的值和变量监视窗口看到的确实不是一回事情!
pConnSet结构体定义如下
typedef struct __recConnSet
{
recConnCallBack rCallBack; /* 回调函数*/
recCfgPara rCfgPara; /* 配置参数*/
recConn rClient;
recConn rListener;
recConn rServers[MAX_CONN_CLIENTS];
}recConnSet;
先是怀疑结构体对齐情况有问题,于是定义#pragma pack(1),或在工程C/C++->Code Generation里设置对齐为1,没有用。
然后怀疑是cpp和c混编问题,将代码所在的c文件改成cpp重新编译(c++严格类型检查,增加了不少代码修改量,苦)。还是没有用。
无奈,修改rClient之前的结构体rCallBack和rCfgPara,使其内部成员严格按4字节对齐,内部成员的整形,枚举,字符串变量分别连续放置。
重新编译, 好象可以了....我闷!觉得这个编译器绝对有问题!这种并非一定是代码问题而是编译选项甚至可能是编译器bug或者过于bt的代码生成规则....真是让人郁闷!
另外还有个郁闷的,vc这个破烂不知道出了什么问题,在单步跟踪的时候,有的文件上光标定位是错的,比如代码实际已经运行到100行,但跟踪的光标指向的却是86行,依次类推,看的我眼狂花,只好通过频繁的打印日志和查看调用堆栈来定位....而且只有个把(偏偏是最重要的)文件如此,其他文件的代码跟踪时指向都是对的!再靠!!
到现在为止,真的很想大叫一声:累死了!!
最后基本能确认是由于部分文件没有正确被编译的原因。可恶的VC6...
打完SP5之后好多了