为什么我会出现分段错误?

时间:2010-03-25 00:57:23

标签: c++ segmentation-fault

如果我将一个大于100的值作为第二个参数传递给BinaryInsertionSort,我会遇到分段错误。

int
BinarySearch (int a[], int low, int high, int key)
{
    int mid;

    if (low == high)
        return low;

    mid = low + ((high - low) / 2);

    if (key > a[mid])
        return BinarySearch (a, mid + 1, high, key);
    else if (key < a[mid])
        return BinarySearch (a, low, mid, key);

    return mid;
}

void
BinaryInsertionSort (int a[], int n)
{
    int ins, i, j;
    int tmp;

    for (i = 1; i < n; i++) {
        ins = BinarySearch (a, 0, i, a[i]);
        if (ins < i) {
            tmp = a[i];
            memmove (a + ins + 1, a + ins, sizeof (int) * (i - ins));
            a[ins] = tmp;
        }
    }
}

3 个答案:

答案 0 :(得分:4)

你正在传递一个数组a []。它必须足够大,以使值hi和low在范围内。

例如,如果你传入一个大小为1的数组,并且低= 0. hi = 2,那么mid = 1将超出范围(大小为1的数组只能取消引用[0], a [1]将超出范围。

答案 1 :(得分:1)

可能是因为堆栈溢出?你递归地调用BinarySearchn的值越大,您将消耗的堆栈空间越多。在这种情况下,我希望你会看到堆栈溢出错误,但我不知道你的环境......

假设您没有使用调试器,测试这个的快速方法是首先找到您得到错误的确切位置(您提到100,但不清楚您不会得到错误99 ...)。

一旦你有了这个,尝试增加每次递归调用BinarySearch所消耗的堆栈空间量(添加一些额外的局部变量,并对它们做足够的事情,使它们不被优化)。你应该看到你不能再成功地做99(或者你以前的最大值)。

答案 2 :(得分:1)

很难说,使用调试器。它将帮助您找到分段故障所在的位置,以及分段故障发生时不同变量的值。

  • on linux:gdb(编译使用带有-g选项的g ++)
  • on windows:visual studio C ++的集成调试器