2016-05-04 239 views
0

此代碼是一個更大的程序的一部分。代碼中有一個main函數,它運行良好,對不起,如果它雜亂。在函數Quick_mode_time在第二個while循環中,我得到了一個分割錯誤,我不明白我是如何搞亂這個數組的。如果有人能指引我正確的方向,我會非常高興!分割故障循環C99

#include <stdio.h> 
#include <time.h> 
#include <math.h> 
#include <ctype.h> 
#include <stdlib.h> 
#include <stdbool.h> 

#define timing_start() start = clock(); 
#define timing_end(f) msec = (double)(clock()-start) * 1000000.0 /CLOCKS_PER_SEC; \ 
    printf("Calling "#f " takes %10.2f microseconds!\n", msec); 

void Quick_mode_time() 
{ 
    srand(time(NULL)); 
    int end=500,final=5000; 
    int a[end],beginning=0; 
    double t1,t2,t_tot; 
    printf("***************COMPARISON***************\n"); 

    printf("    quicksort  bubblesort  (in microseconds)\n"); 
    while(end!=final){ 

     while(beginning<end) 
     { 
      a[beginning]=rand()%end; // <--- This causes a segmentation fault 
      beginning++; 
     } 
     printf("N=%d",end); 

     t1=clock(); 
     quicksort_time(a,0,end); 

     t2=clock(); 
     t_tot= (double)(t2-t1)*1000/CLOCKS_PER_SEC; 
     printf("\t%7.3f\t", t_tot); 
     end+=500; 
    } 
} 

void quicksort_time(int x[],int first,int last){ 
    int pivot,j,temp,i; 
    // The Quick Sorting algorithim is below! 
    if(first<last){ 
     pivot=first; 
     i=first; 
     j=last; 

     while(i<j){ 
      while(x[i]<=x[pivot]&&i<last) 
       i++; 
      while(x[j]>x[pivot]) 
       j--; 
      if(i<j){ 
       temp=x[i]; 
       x[i]=x[j]; 
       x[j]=temp; 
      } 
     } 

     temp=x[pivot]; 
     x[pivot]=x[j]; 
     x[j]=temp; 
     quicksort_time(x,first,j-1); 
     quicksort_time(x,j+1,last); 
    } 
} 
+2

你使用調試器來確定哪些線路出現故障? – MikeCAT

+0

代碼中有一段說明段落髮生的地方。 OP似乎並不知道的是數組'a [end]'在增加'end'時沒有增加。 – user3386109

+0

'end + 1-end'是'1'。你確定這是你想要的嗎? – MikeCAT

回答

2

這條線:

int a[end] 

創建的500個整數的數組

此行

a[beginning]=rand()%(end+1-end)+end; 

寫操作(結束在之前的線設定爲500),以a[beginning]其是行只要beginning小於500.

這似乎s到僅通過這條線之上進行檢查:

while(beginning<end) 

在你的代碼,但後來,你有:

end+=500; 

如此突然,到底能爲> 500,這意味着開始可以> 500這意味着你在數組邊界之外寫入。

一個解決將是改變你的聲明,使a足夠大:

int a[final] 
+0

謝謝我現在就來測試一下吧! –

+0

你是對的謝謝你! –

0

你的外循環while退出從來沒有因爲你永遠不修改endfinal值。

+1

它們被修改在最後一個括號前我修改結束+ = = 500 –