两个指针错误:每当我使用 while(left<=right) 时,它都会出现错误,但是当我删除等号时,它可以正常工作

two pointer error: whenever i use while(left<=right) it gives an error, but when i remove the equal sign it works fine

提问人:Jeet Majumdar 提问时间:8/18/2023 最后编辑:Vlad from MoscowJeet Majumdar 更新时间:8/18/2023 访问量:44

问:

vector<int> v{-10,-7,-3,2,5,6}, v1(6);
    int left = 0;
    int right = 5;
    int i=0;
    while (left<=right){
        if (abs(v[left])>abs(v[right])){
            v1[i]=v[left]*v[left];
            left++;
        }
        else if (abs(v[left])<abs(v[right])){
            v1[i]=v[right]*v[right];
            right--;
        }
         else if (abs(v[left])==abs(v[right])){
             v1[i]=v[right]*v[right];
         }
        i++;
    }
    reverse(v1.begin(), v1.end());
    for (int ele:v1)
    {
        cout<<ele<<" ";
    }

每当我使用 (left<=right) 时,它都会出现错误,但是当我删除等号时,它工作正常

c++ if 语句 while 循环 stdvector undefined-behavior

评论

0赞 mch 8/18/2023
while (left<=right)运行 7 次(崩溃前),因此最后一次访问越界。 运行 6 次,因此没有这个问题。v[i]while (left<right)
0赞 Eljay 8/19/2023
第一句在正文中,if (i > 5) throw "oops";

答:

0赞 Vlad from Moscow 8/18/2023 #1

由于这个 else 语句

 else if (abs(v[left])==abs(v[right])){
     v1[i]=v[right]*v[right];
 }

当等于 时,您可以获得无限循环,因为两者都没有更改。另一方面,变量递增leftrightleftrighti

i++;

因此,将访问向量之外的内存。v1

0赞 Misha T 8/18/2023 #2

如果你的周期变得无休止。并且你每次都会递增,所以你会调用 ,其中 5 以上,并收到 SEGFAULTleft == rightiv1[i]=v[right]*v[right];i