排序中的分段错误

时间:2013-03-31 14:27:49

标签: c arrays

使用名为tubor sort的算法对数组进行排序时,我实现了它,当我运行它时,我得到了分段错误。即使我在网上搜索并且没有类似的错误,我决定在这里发帖。这个错误可能是因为我将for循环中的aux数组的大小设置为数组的大小,有没有更好的方法来编写这段代码?以下是来源。

#include <stdio.h>

void TuborSort(int* array) {
  int aux[5] = { 0, 0, 0, 0, 0 };
  int i;

  for (i = 0; i < sizeof(array); i++) {
    aux[array[i]]++;
  }

  int j = 0;
  for (i = 0; i < 5; i++) {
    while(aux[i]-- > 0) {
      array[j++] = i;
    }
  }
}

int main() {
  int array[6] = {2, 5, 1, 4, 1};
  int i;

  TuborSort(array);

  for (i = 0; i < sizeof(array); i++)
    printf("%d ", array[i]);

  return 0;
}

3 个答案:

答案 0 :(得分:3)

你说aux[array[i]]++和aux只有5个元素。所以 array(5)中的第二个元素太大,无法用作aux的索引。


作为旁注,您使用sizeof的方式是错误的,您需要将数组的长度作为附加参数传递。

正如Alexey所说,在main中,for应该是:

size_t i;
for (i = 0; i < sizeof(array) / sizeof(*array); i++)

答案 1 :(得分:3)

sizeof(array)函数中的

TuborSort()不合适。正如你声明arrayint *而不是6个整数的数组,这不是你想要的。

此外,您需要数组中的元素数量sizeof,而不是sizeof(array)/sizeof(array[0])

答案 2 :(得分:0)

对于了解Java的人来说,这是一个非常常见的错误,c和c ++中的指针的大小通常来自PC上的体系结构32/64位。

一旦你将指针传递给数组,你必须发送它的长度,否则你不能知道它的长度。