编辑:最初我抄写了i++
而不是i--
现在的代码是原来的,代码块中的代码编译并工作。
为什么,如果在下面的代码片段中使用unsigned int i;
而不是int i;
,那么使用该函数会导致segfault?
void insertion_sort_int_array(int * const Ints, unsigned int const len) {
unsigned int pos;
int key;
int i;
for (pos = 1; pos < len; ++pos) {
key = Ints[pos];
for (i = (pos - 1); (i >= 0) && Ints[i] > key; i--) {
Ints[i + 1] = Ints[i];
}
Ints[i + 1] = key;
}
}
最佳答案
insertionSort(array A)
begin
for x := 1 to length[A]-1 do
begin
value := A[x];
i := x - 1;
while i >= 0 and A[i] > value do
begin
A[i + 1] := A[i];
i := i - 1;
end;
A[i + 1] := value;
end;
end;
标准插入排序算法和您的代码之间的唯一区别是,您是递增i而不是递减。那是你的问题。我敢打赌,在实际编译和运行的代码中,有I——而不是I++在内部循环中。这就是为什么无符号i有区别-它不能为负,所以内部循环永远不会结束。你发邮件的时候把代码抄错了吗?
编辑:
好吧,既然你修改了发布的代码,一切都有意义了,对吧?无符号i将在您将其递减到0之后简单地下溢到INT_MAX,这将导致您访问数组边界之外的内存。
关于c - uint作为索引,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1891067/