对数组进行操作时,一定要注意数组的可索引范围,保证数组不发生越界。在 Leetcode 中数组越界会给出如下几种报错信息:
1. AddressSanitizer: heap-buffer-overflow on address
报错信息:
==42==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x603000000328 at pc 0x00000034c60d bp 0x7ffc704fd4b0 sp 0x7ffc704fd4a8
报错原因:
AddressSanitizer 被用来检查内存的非法访问,在 leetcode 中出现 AddressSanitizer: heap-buffer-overflow on address
类似报错,主要原因可能是存在数组越界。
- 一维数组 num的索引 i 的范围为
0 <= i < num.size()
- 二维矩阵 matrix 的索引 i 和 j ,i 的范围是
0 <= i < matrix.size()
, j 的范围是0 <= j < matrix[i].size()
如果是二维矩阵,则要格外注意索引 i 和 j 的增减关系,保证索引都不超出数组维度范围。
下面以 Leetcode 240. 搜索二维矩阵 II 题 为例进行说明。matrix 是一个二维矩阵, i 和 j 分别是矩阵的索引,i 的范围是0 <= i < matrix.size()
, j 的范围是0 <= j < matrix[i].size()
。条件 while(i < matrix.size() && j >= 0)
,同时保证了索引 i 和 j 不超出数组维度范围。
class Solution {
public:
bool searchMatrix(vector<vector<int>>& matrix, int target) {
int i = 0; int j = matrix[i].size() - 1;
while(i < matrix.size() && j >= 0)
if(matrix[i][j] == target)
{
return true;
}
else if(matrix[i][j] > target)
{
j--;
}
else
{
i++;
}
}
return false;
}
};
2. runtime error: reference binding to misaligned address
报错信息:
runtime error: reference binding to misaligned address 0xbebebebebebebebe for type
报错原因:
数组越界,需要加入判断数组是否为空或者堆栈是否为空的语句。避免对空的数组或者堆栈进行相关操作。
比如当二维数组为空时,访问matrix[0].size() 就会发生报错。
堆栈 stk 为空时,使用 stk.top() 和 stk.pop() 就会发生报错。