L_J_SHOU

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

请找出下面程序的 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。

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

posted on 2014-04-09 14:19  L_J_SHOU  阅读(139)  评论(0)    收藏  举报