C++ STL递归调用时的未定义行为[重复]

问题描述 投票:0回答:1

在复习 Leetcode 问题时,我想找到填充为 0 的子数组。 我做了一个递归函数来完成任务,但它抛出了一个错误。

class Solution {
public:
    void helper(vector<int>& nums,int i,long long &sum){
        // Base Case
        if(i>=nums.size()) return;
        if(nums[i-1]==0 && nums[i]!=0) return;
        // Recursive Case
        if(nums[i]!=0) helper(nums,i+1,sum);
        else{
            helper(nums,i+1,sum);
            sum+=1;
        }
    }
    long long zeroFilledSubarray(vector<int>& nums) {
        long long sum = 0;
        helper(nums,0,sum);
        return sum;
    }
};
Line 1034: Char 34: runtime error: addition of unsigned offset to 0x603000000070 overflowed to 0x60300000006c (stl_vector.h)
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior /usr/bin/../lib/gcc/x86_64-linux-gnu/9/../../../../include/c++/9/bits/stl_vector.h:1043:34
c++ recursion stl
1个回答
2
投票

vector::operator[]
取一个无符号整数。当
i
为 0 时,
i-1
-1
,当转换为无符号整数时将换行到一个非常大的值。因此,当
nums[i-1]
为 0 时,
i
越界。

© www.soinside.com 2019 - 2024. All rights reserved.