我写了一个小数组合并程序。在运行时我得到分段错误。任何人都可以指出我在这里可能出了什么问题吗?
#include <iostream>
using namespace std;
void merge(int arr[], int p, int q, int r)
{
int L[q-p+1];
int R[r-q];
for(int i = p; i < r;i++)
{
if(i<q+1)
{
L[i] = arr[i];
}
else
{
R[i-q+1] = arr[i];
}
}
int i = 0, j = 0,k = p;
while(i<q-p+1 || j<r-q)
{
if(L[i]>R[j])
{
arr[k] = R[j];
j++;
}
else
{
arr[k] = L[i];
i++;
}
k++;
}
if(i == q-p+1)
{
for(;j<r-q;j++,k++)
{
arr[k] = R[j];
}
}
if(j == r-q)
{
for(;i<q-p+1;i++,k++)
{
arr[k] = L[i];
}
}
}
int main()
{
cout << "Hello world!" << endl;
int a[] = {2,4,6,8,1,3,5,9};
merge(a,0,3,7);
for(int i = 0; i<8;i++)
{
cout<<a[i]<<"\t";
}
return 0;
}
答案 0 :(得分:0)
您应该在调试器中单步执行它。
这行代码:
while (i<q - p + 1 || j<r - q)
不会阻止我成为&gt; = q-p+1
(即如果j仍然小于r-q
)。这意味着您正在数组边界之外阅读。
您应该将其更改为
while (i<q - p + 1 && j<r - q)
另请注意:int L[q-p+1]
无效C ++,它是有效的C,但不是C ++