【问题标题】:Segmentation fault on big array大阵列上的分段错误
【发布时间】:2018-09-16 21:39:01
【问题描述】:

我使用quicksort 来查看它订购大数组的速度有多快。 我订购了 100 万没有问题.. 200 万没有问题。 300万给出一个段错误。一些测试显示它在 200 万到 210 万之间崩溃,而 GDB 显示崩溃来自“填充”函数。

这是代码:

int partition(int v[], int N){

  int i, j;
  int x = v[N-1];

  for(i = 0, j = 0; i < N - 1; i++){
    if (v[i] < x) swap(v, j++, i);
  }
  swap(v, j, N - 1);
  return j;
}


void quickSort(int v[], int N){
  int p;

  if (N > 1){
    p = partition(v, N);
    quickSort(v, p);
    quickSort(v + p + 1, N - p - 1);
  }
}


void fill(int v[], int N){
  srand(clock());

  for(int i = 0; i < N; i++){
    v[i] = rand();
  }
}


int main() {

  int size = 3000000;
  int v[size];

  fill(v, size);
  printf("ready\n\n");
  quickSort(v, size);

  for(int i = 0; i < size; i++)
    printf("%d ", v[i]);

  printf("\n\nDone\n\n");

  return 0;
}

代码在该特定数字处开始崩溃是否有任何特殊原因? 谢谢大家的解答

【问题讨论】:

    标签: c arrays sorting


    【解决方案1】:

    使用int size = 3000000;int v[size],您正在“堆栈”上创建一个局部变量。堆栈 - 与堆相比 - 相当有限;所以3000000 可能会超过可用的堆栈大小,而3000 可能不会。

    要在堆上创建v,请写

    int *v = malloc(size);
    

    然后,检查您是否可以分配所需的空间:

    if (!v) {
       printf("not enough space.");
       return 1;
    }
    ....
    

    【讨论】:

    • 哦,是的,有道理...非常感谢
    猜你喜欢
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多