簡體   English   中英

空輸入如何出現AddressSanitizer錯誤

[英]How come out the AddressSanitizer error for empty input

以下代碼計算兩個相鄰元素之間的最大氣體。 輸入向量未排序。

class Solution {
public:
int maximumGap(vector<int>& nums) {
    int max = 0;
    sort(nums.begin(), nums.end());
    for(int i = 0; i < nums.size() -1; i++) {
        if(nums[i+1] > nums[i] + max) max = nums[i+1] - nums[i];
    }
    return max;
}
};

但是,如果輸入為空,則會產生以下錯誤(例如[])

AddressSanitizer:DEADLYSIGNAL
=================================================================
==29==ERROR: AddressSanitizer: SEGV on unknown address 0x000000000004 (pc     0x00000040d54a bp 0x7ffe00e1e520 sp 0x7ffe00e1df50 T0)
==29==The signal is caused by a READ memory access.
==29==Hint: address points to the zero page.
#1 0x7fde1d3ab2e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0)

AddressSanitizer can not provide additional info.
==29==ABORTING

可以通過以下解決此問題:

if(nums.empty()) return 0;

只想知道錯誤是如何產生的? 我認為空輸入還應該為原始代碼輸出0。

nums.size()是無符號類型,因此當它為零時, nums.size() - 1是一個巨大的正數,您的循環將運行。

您可以通過將循環條件重寫為:

i + 1 < nums.size()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM