这几天帮师兄做仿真,由于特别急,代码写的很乱,我一半写代码都用C语言的风格,即使编的是CPP文件。
C++中,可以随便定义变量,比C语言好用,标准的C语言是不支持for(int i = 0; i < 5; i++)的。C++中有这个特性,让我犯了一个很简单的错误,花了一天时间才把bug找出来。
为了让自己不再犯这么低级的错误,特地写一篇日志纪念一下。
一开始写了这样的代码:
- if(len == 1)
- {
- sp[0] = 1;
- sp[1] = end;
-
- for(int k = 0; k < sub[sn_index].links; k++)
- if((sub[sn_index].link[k].from == start && sub[sn_index].link[k].to == end)||
- (sub[sn_index].link[k].from == end && sub[sn_index].link[k].to == start))
- break;
- if(k == sub[sn_index].links)
- return 0;
-
- if(sub_req[req_index][subreq_index].link[index].bw > s2v_l[sn_index][k].rest_bw)
- return 0;
- return 1;
- }
编译错误,下面的k的作用域有问题,然后我增加了int k
- if(len == 1)
- {
- sp[0] = 1;
- sp[1] = end;
- int k;
- for(int k = 0; k < sub[sn_index].links; k++)
- if((sub[sn_index].link[k].from == start && sub[sn_index].link[k].to == end)||
- (sub[sn_index].link[k].from == end && sub[sn_index].link[k].to == start))
- break;
- if(k == sub[sn_index].links)
- return 0;
- if(sub_req[req_index][subreq_index].link[index].bw > s2v_l[sn_index][k].rest_bw)
- return 0;
- return 1;
- }
编译通过了,很开心,大部分结果都对,有一部分结果老是不对,我找啊找,就是没找到原因,最后我终于找到了,C++怎么都不警告我一下呢。
但是为什么没有出现段错误呢?我把第一个k全部打印出来,结果全是0,理论上k应该是不确定的,我用的是64位Linux,换成32位的试试,果然出现段错误了,但是64位也应该出段错误啊。我换了一台64位的机器,打印第一个k,前边很多都是0,后来出来一个大数,段错误了。
本文转自nxlhero 51CTO博客,原文链接:http://blog.51cto.com/nxlhero/731123,如需转载请自行联系原作者