编辑:最初我抄写了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/

10-13 03:05