地址上的堆 - 缓冲器跨流

heap-buffer-overflow on address

本文关键字:缓冲器 地址      更新时间:2023-10-16

给定一个数组,其中包含n个不同的数字,从0、1、2,...,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 %dn", 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;
    }
};

学习使用调试器。

您的问题是,第一次通过循环运行后,输入为[3, 0, -3]。处理最终元素时,您将尝试访问-4,这永远不会结束。

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