STL 库中的陷阱----一个难以察觉的 bug

来源:互联网 发布:网络排名优化方案 编辑:程序博客网 时间:2024/05/16 00:25

请找出下面程序的 bug?

int maxProfit2(vector<int> &prices){  int local[3] = {0};  int global[3] = {0};    for(int i=0; i<prices.size()-1; ++i)   {    int diff = prices[i+1] - prices[i];    for(int j=2; j>=1; --j)    {      local[j] = max(global[j-1]+max(diff, 0), local[j]+diff);      global[j] = max(global[j], local[j]);    }  }  return global[2];}

当 prices 为空的时候,程序出现 segmentation fault.


分析:

本以为 prices为空时,for循环内部就不会运行,没想到,竟然运行了!!!

问题出在了 i < prices.size() -1

prices.size() 返回的类型是 size_t, 其实是一个无符号数,

无符号数与 - 1 运算时,将有符号数 - 1 隐式转化为无符号数,大家知道 -1 的补码表示是 0xffff ffff  ffff ffff,

所以当 prices为空时, 0 + 0xffff ffff ffff ffff  = 0xffff ffff ffff ffff ffff = 2^64 -1

因此,i < prices.size() -1 (无符号数比较)满足;


怎么办呢?

可以这样

int n = prices.size();  // 先把 prices.size() 赋给 有符号数 n。

不知道有没有其他的好方法,欢迎留言。。。

5 0
原创粉丝点击