我想问一下为什么在VScode中奇偶冒泡排序的偶数边会引发一个zsh:abort错误?是因为它超出了范围吗?如果是这样,是不是意味着我必须精确地修改范围?谢谢!
#include <iostream>
using namespace std;
int main()
{
int a[10];
for (int i=0;i<10;i++)
{
cin>>a[i];
}
//First, sort odd and even numbers
int l=0,r=9;//point to the two ends of the array
while (l<=r)
{
bool leftIsOdd=a[l]%2==1;
bool rightIsEven=a[r]%2==0;
//move the two pointers from ends to middle
if (leftIsOdd)
{
l++;
}
else if (rightIsEven)
{
r--;
}
//since it's a symmetric array, with 5 odd and 5 even, we can swap when both sides get stuck
//Q:If we have 4 odd numbers and 6 even numbers, is the approach OK?
else if (!leftIsOdd && !rightIsEven)
{
int temp=a[l];
a[l]=a[r];
a[r]=temp;
}
}
//perform bubble sort for left odd part
int start=0,end=l;
for (int i=start; i<end-1;i++)
{
for (int j=start+1;j<end-i;j++)
{
if (a[j-1]>a[j])
{
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}
//now bubble the right even side
start=l,end=10;
for (int i=start; i<end-1;i++)
{
for (int j=start+1;j<start+end-i;j++)
# # # //Why j<start+end-1 would produce error?
{
if (a[j-1]>a[j])
{
int temp=a[j];
a[j]=a[j-1];
a[j-1]=temp;
}
}
}
for (int i=0;i<10;i++)
{
cout<<a[i]<<' ';
}
return 0;
}
我尝试将索引j置于预期范围之外,但收到了zsh:abort错误。
1条答案
按热度按时间ccrfmcuu1#
如果你用前面提到的
10,9,8,7,6,5,4,3,2,1
初始化输入数组a
,那么当你到达“// now bubble the right even side”循环时,你会把start
初始化为5,把end
初始化为10。如果你写j<start+end-1
,那么j
就可以大到13。(即j必须小于14)。然后您将尝试访问a[13]
,但a
只有10个元素。因此,如果幸运的话,您将在运行程序时得到某种内存访问错误,并且它将崩溃。我不知道为什么要用导致崩溃的表达式
j<start+end-1
替换表达式j<start+end-i
(似乎可以工作)。在声明和初始化
a
之后,只需包含a[13]=0;
行,就可以使崩溃更容易发生。当你使用数组时,你有责任确保所有数组访问都是有效的。当你问“这是否意味着我必须精确地修改范围”时,答案是“是的,绝对的!”