#c #arrays #data-structures
#c #массивы #структуры данных
Вопрос:
Это проблема с исходным кодом, которую я пытаюсь решить https://leetcode.com/problems/container-with-most-water / Ниже приведен код, который выполняется в моей ide, но я не могу запустить этот код. Там отображается ошибка AddressSanitizer. Пожалуйста, помогите мне решить эту проблему
class Solution
{
public:
int maxArea(vector<int>amp; height)
{
int n=height.size(),product=1;
int i=0,j=n-1;
while(i<j)
{
int x=(height[i]<height[j])?height[i]:height[j];
int y=j-i;
int p=x*y;
if(product<p)
product=p;
while(height[i]<=height[j])
i ;
while(height[i]>height[j])
j--;
}
return product;
}
};
=================================================================
==31== ОШИБКА: AddressSanitizer: переполнение буфера кучи по адресу 0x606000000060 на ПК 0x0000003760a2 bp 0x7ffc947d7160 sp
0x7ffc947d7158 ЧТЕНИЕ размера 4 в потоке 0x606000000060 T0
#3 0x7f4235b5f0b2 (/lib/x86_64-linux-gnu/libc.so.6 0x270b2) 0x606000000060 расположен на 0 байт правее 64-байтовой области
[0x606000000020,0x606000000060), выделенный потоком T0 здесь:
#10 0x7f4235b5f0b2 (/lib/x86_64-linux-gnu/libc.so.6 0x270b2) Теневые байты вокруг адреса с ошибкой: 0x0c0c7fff7fb0: 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 0x0c0c7fff7fc0: 00 00 00 00 00
00 00 00 00 00 00 0000 00 00 00 0x0c0c7fff7fd0: 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 0x0c0c7fff7fe0: 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 0x0c0c7fff7ff0: 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00
=>0x0c0c7fff8000: fa fa fa fa 00 00 00 00 00 00 00 00[fa]fa fa fa 0x0c0c7fff8010: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c0c7fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c0c7fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c0c7fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c0c7fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Комментарии:
1. Например, когда вы это делаете:
while(height[i]<=height[j]) i ;
у вас может быть внеполосный доступ. Вы должны это проверитьi < n
. То жеj >= 0
самое для следующих строк.2. @Damien Спасибо за ответ. Не могли бы вы сказать мне, какие изменения я должен внести в свой код, чтобы я мог избежать этого из-за ограниченного доступа, поскольку он все еще не работает, когда я меняю оператор цикла while следующим образом: while((i<j)amp;amp;(i<n)amp;amp;(j>= 0))
3. У вас всегда есть ошибка AddressSanitizer?
4. Ваша модификация не устраняет тот факт, что здесь
while(height[i]<=height[j]) i ;
у вас может быть внеполосный доступ. Вы должны попробоватьwhile((i<n)amp;amp;(height[i]<=height[j])) i ;
. Примерно то же самое дляj
следующегоwhile(...)
5. Большое спасибо, @Damien за помощь.