大阵列上的分段错误

Ped*_*des 0 c arrays sorting

我正在使用它quicksort来查看订购大型数组的速度有多快.我订购了一百万没问题.. 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;
}
Run Code Online (Sandbox Code Playgroud)

代码是否有任何特殊原因导致该特定数字崩溃?谢谢你的任何答案

Ste*_*ner 5

使用int size = 3000000;int v[size],您将在"堆栈"上创建一个局部变量.堆栈 - 与堆相比 - 相当有限; 因此,3000000可能超过可用的堆栈大小,而3000例如,可能不会.

v在堆上创建,请写入

int *v = malloc(size);
Run Code Online (Sandbox Code Playgroud)

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

if (!v) {
   printf("not enough space.");
   return 1;
}
....
Run Code Online (Sandbox Code Playgroud)

  • 哦,yhea,这很有道理......非常感谢你 (2认同)