学习心得--Leetcode报错 AddressSanitizer: heap-buffer-overflow on address 0x60200000002c (leetcode算法题4附代码)

学习心得:

最近一直在刷leetcode,虽然刷的慢,但学的东西真的不少。上一篇学习心得我有讲过之前一直出现了内存溢出的情况,但一直未能解决。在刷到第四题:寻找两个数组的中位数时,我再次遇到了相同的问题。但这次我终于能找出原因了。先贴出错误的提示:
在这里插入图片描述
在这里插入图片描述
LeetCode 使用了AddressSanitizer检查是否存在内存非法访问,它的问题主要是说我们对于数组的访问越界了。这个确实很头疼。
当时上网查了很多,我在下面这篇文章中得到了一些启示。文章里说赋值加减的操作可能会导致数组的越界。通俗来说,往往错误就在于i++,等自增或访问下一个数组元素的操作,这些操作可能顺序颠倒,也可能在循环的最后一次多了一次访问操作,导致数组的越界。
https://blog.csdn.net/huihui_8/article/details/100052677

在知道大概的原因之后,我在代码里加了好几个判断语句,避免出现越界情况。索性最后真的通过了。附上代码:

double findMedianSortedArrays(int* nums1, int nums1Size, int* nums2, int nums2Size){
    int size_left = (nums1Size + nums2Size + 1)/2;
    int i = 0, j = size_left-i;
    double max_left,min_right;
    if(nums1Size > nums2Size){
        int *temp,t;
        temp = nums1;
        nums1 = nums2;
        nums2 = temp;
        t = nums1Size;
        nums1Size = nums2Size;
        nums2Size = t;
    }
    if(nums1Size==0 && nums2Size==0)
        return 0;
    else if(nums1Size==0){
        max_left = nums2[(nums2Size-1)/2];
        min_right = nums2[nums2Size/2];
    } 
    else{
        while(i<=nums1Size){
            if(i == nums1Size){
                if(j==0)
                    max_left = nums1[i-1]; 
                else
                    max_left = nums1[i-1]>nums2[j-1]?nums1[i-1]:nums2[j-1];
                min_right = nums2[j];
                break;
            }
            else if(nums1[i]>=nums2[j-1]){
                if(i==0){
                    if(j==nums2Size)
                        min_right = nums1[i];
                    else
                        min_right = nums1[i]<nums2[j]?nums1[i]:nums2[j];
                    max_left = nums2[j-1];
                    break;
                }
                max_left = nums1[i-1]>nums2[j-1]?nums1[i-1]:nums2[j-1];
                min_right = nums1[i]<nums2[j]?nums1[i]:nums2[j];
                break;

            }
            else{   
                i++;
                j = size_left-i;
            }    
        }
    }
    if((nums1Size + nums2Size)%2 == 0)
        return (max_left+min_right)/2;
    else
        return max_left;

}

在这里插入图片描述

发布了6 篇原创文章 · 获赞 0 · 访问量 136

猜你喜欢

转载自blog.csdn.net/weixin_38072112/article/details/103972360
今日推荐