地址上的堆缓冲区溢出

时间:2019-03-04 16:10:39

标签: c++ vector

给出一个包含从0、1、2,...,n中提取的n个不同数字的数组,找到该数组中缺少的那个。

示例1:

输入:[3,0,1]

输出:2

我的方法是读取每个元素,然后将该索引乘以-1。哪个数组索引保持正数就是缺少的那个(我必须分别处理零)

我的代码在我试图将元素乘以-1的行上导致堆溢出

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        bool zeroFound = false;
        for(auto i = nums.begin(); i < nums.end(); i++) {
            if(*i == 0) {
                zeroFound = true;
            } else {
                int value = *i;
                printf("Inner %d %d\n", value, nums[value -1]);
                //nums[value - 1] = value * (-1);
            }   
        }
        if(!zeroFound) {
            return 0;
        } else {
            int count = 1;
            for(auto i = nums.begin(); i < nums.end(); i++, count++) {
                if(*i > 0) {
                    return count;
                }
            }
        }
        return -1;
    }
};

1 个答案:

答案 0 :(得分:1)

学习使用调试器。

您的问题是,在第一次运行循环之后,输入为[3, 0, -3]。当您处理最后一个元素时,您尝试访问元素-4,但它永远不会结束。

即使您使用元素的绝对值,您的第一次运行也将覆盖最后一个元素-因此,您将无法再确定输入是[3, 0, 1]还是[3, 0, 2]