如果我将一个大于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;
}
}
}
答案 0 :(得分:4)
你正在传递一个数组a []。它必须足够大,以使值hi和low在范围内。
例如,如果你传入一个大小为1的数组,并且低= 0. hi = 2,那么mid = 1将超出范围(大小为1的数组只能取消引用[0], a [1]将超出范围。
答案 1 :(得分:1)
可能是因为堆栈溢出?你递归地调用BinarySearch
。 n
的值越大,您将消耗的堆栈空间越多。在这种情况下,我希望你会看到堆栈溢出错误,但我不知道你的环境......
假设您没有使用调试器,测试这个的快速方法是首先找到您得到错误的确切位置(您提到100,但不清楚您不会得到错误99 ...)。
一旦你有了这个,尝试增加每次递归调用BinarySearch
所消耗的堆栈空间量(添加一些额外的局部变量,并对它们做足够的事情,使它们不被优化)。你应该看到你不能再成功地做99(或者你以前的最大值)。
答案 2 :(得分:1)
很难说,使用调试器。它将帮助您找到分段故障所在的位置,以及分段故障发生时不同变量的值。
-g
选项的g ++)