这里的分段错误的原因是什么?

时间:2015-10-03 05:47:36

标签: c++ segmentation-fault

我写了一个小数组合并程序。在运行时我得到分段错误。任何人都可以指出我在这里可能出了什么问题吗?

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

1 个答案:

答案 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 ++