运行时错误:添加unsigned offset/UndefinedBehaviorSanitizer: undefine



我找不到我的向量出界的地方。这是leetcode问题695的解法。

错误:

Line 1034: Char 34:运行时错误:添加无符号偏移量到0x610000000040溢出到0x610000000028 (stl_vector.h)UndefinedBehaviorSanitizer: undefine -behavior/usr/bin/……/lib/gcc/x86_64-linux-gnu/9/…/…/…/include/c++/9/bits/stl_vector.h:1043:34

代码:

int maxAreaOfIsland(vector<vector<int>>& grid) {
int n = grid.size();
int m = grid[0].size(); 

vector<vector<int>> vis(n,vector<int>(m,0));
int ans =0 ;
for(int i=0;i<n;i++) {
for(int j=0;j<m;j++) {
int count  = 0;
if(grid[i][j]==1 && !vis[i][j]) {
vis[i][j]=1;
queue<pair<int,int>> q;
q.push({i,j});
count++;
while(!q.empty()) {
int  a = q.front().first;
int  b = q.front().second;
q.pop();

int r[] = {-1, 1, 0, 0};
int c[] = {0, 0, 1, -1};

for(int z=0; z<4; z++) {
int x = a + r[z];
int y = b + c[z]; 
if(x<n && y<m && grid[x][y]==1 && !vis[x][y]) {
vis[x][y]=1;
q.push({x,y});
count++;
}
}

}
ans = max(ans,count);
}
}
}
return ans;
}

我希望

if(x<n && y<m && grid[x][y]==1 && !vis[x][y]) {

应该

if (x>=0 && y>=0 && x<n && y<m && grid[x][y]==1 && !vis[x][y]) {

注意在错误addition of unsigned offset to 0x610000000040 overflowed to 0x610000000028。换句话说,无符号偏移量是负的(当被视为有符号量时)。

总是小心混合有符号和无符号算术。

我找不到我的向量出界的地方

最简单的方法(IMO)找出你在向量中出界的地方是使用std::vector::at而不是std::vector::operator[]

当使用at时,如果索引大于或等于向量的大小,您将获得out_of_range异常。例如,使用grid.at(i).at(j)代替grid[i][j],等等。

相关内容

  • 没有找到相关文章

最新更新