这里分割故障的原因是什么?

What is cause of segmentation fault here?

本文关键字:是什么 分割 故障 这里      更新时间:2023-10-16

我写了一个小数组合并程序。在运行中,我得到分割错误。谁能告诉我哪里出了问题?

#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;
}

您应该在调试器中逐步执行。

这行代码:

while (i<q - p + 1 || j<r - q)

不会阻止i>= q-p+1(即如果j仍然小于r-q)。这将意味着您正在读取数组边界之外的内容。

应该改成

while (i<q - p + 1 && j<r - q)

还注意:int L[q-p+1]不是有效的c++,它是有效的C,但不是c++