-4

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

#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;
}
4

3 回答 3

3

你是说aux[array[i]]++aux只有5个元素长。所以(5) 中的第二个元素array太大而不能用作 的索引aux


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

正如 Alexey 所指出的,在mainfor 中应该是:

size_t i;
for (i = 0; i < sizeof(array) / sizeof(*array); i++)
于 2013-03-31T14:30:41.217 回答
3

sizeof(array)在你的TuborSort()功能是不合适的。正如您所声明arrayint *那样,不是 6 个整数的数组,这不是您想要的。

此外,sizeof您不需要数组中的元素计数,即sizeof(array)/sizeof(array[0]).

于 2013-03-31T14:32:25.517 回答
0

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

一旦你传递一个指向数组的指针,你必须发送它的长度,否则你无法知道它的长度。

于 2013-03-31T14:34:45.670 回答