请找出下面程序的 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。
不知道有没有其他的好方法,欢迎留言。。。