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。

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

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值