2014-03-27 28 views
-4

我正在運行這個程序(對於Collatz Conjecture),我在第33行得到了分段錯誤,但第33行只是在塊尾部的}。我不知道這是否是堆棧問題。你能幫我嗎?Collat​​z猜想程序中的分段錯誤C

int main(int argc, char** argv) { 
    int x,y,temp; 
    int maximum_cycle[MAX_NUMERO]; 
    scanf("%d",&x); 
    scanf("\n%d",&y); 
    if (x>y){ 
     temp=x; 
     x=y; 
     y=temp; 
    } 
    hallarNumeroCiclo(x,y,&maximum_cycle[MAX_NUMERO]); 
    printf("\n%d %d %d\n",x,y,Maximo(x,y,&maximum_cycle[MAX_NUMERO])); 
    return (EXIT_SUCCESS); 
} 

hallarNumeroCiclo(int x,int y,int *maximum_cycle[MAX_NUMERO]){ 
    int k,n;  
    for (n=0;(x < y) ;--y){ 
     for(k=y;k!=1;){ 
      if ((k % 2) ==0) 
      { 
       k/=2; 
       n+=1; 
      } 
      else if ((k%2)==1) 
      { 
       k = 3*k+1; 
       n+=1; 
      } 
      if (k==1) { 
       n+=1; 
      /*this is the line where the error occurs, the next bracket */ 
      } 
     } 
     *maximum_cycle[y-x]=n; 
    }  
} 

int Maximo(int x, int y,int *maximum_cycle[MAX_NUMERO]){ 
    int i; 
    int maximo =0; 
    for(i=0;(i>(y-x));i++){ 
     if (*maximum_cycle[i]>maximo){ 
      maximo=*maximum_cycle[i]; 
     } 
    } 
    return maximo; 
} 
+0

這是33行? – Bathsheba

+0

你的編譯器應該給你這個代碼的一些重要警告,因爲它有一些嚴重的問題 - 我希望你有警告啓用? –

+0

請閱讀此:http://ericlippert.com/2014/03/05/how-to-debug-small-programs/和此:http://stackoverflow.com/questions/how-to-ask –

回答

2

你傳入&maximum_cycle[MAX_NUMERO]hallarNumeroCircloMaximo這是一個整數指針!這是由於數組索引選擇了一個,然後您將其地址。

但是,函數所需的類型是一個數組,當您嘗試寫入它時,會將 寫入未知/未映射區域,從而SIGSEGVing您的程序。

你的問題是有效的,除了指針指針,而你傳遞它的指針。請注意,分配給指針數組的空間可能比實際的整數數組小。在x86上它們是相同的,但在這裏你的問題是你的代碼在你的指針中寫入僞造的東西,而取消引用下一個指針會使你崩潰。

嘗試使用&maximum_cycle而不是&maximum_cycle[MAX_NUMERO]在您的來源。

0

此行

int maximum_cycle[MAX_NUMERO]; 

聲明一個int陣列命名maximum_cycleMAX_NUMERO元件。

這樣做

hallarNumeroCiclo(x,y,&maximum_cycle[MAX_NUMERO]); 

向下傳遞到被調用的函數陣列maximum_cycleMAX_NUMERO + 1元件的ADRESS。在C數組中是0 -based,那我們[0]地址他第一個元素。


hallarNumeroCiclo(int x,int y,int *maximum_cycle[MAX_NUMERO]); 

期望的指針(地址)的int陣列MAX_NUMERO元件,所以調用這樣的功能:

hallarNumeroCiclo(x,y,&maximum_cycle); 

內部hallarNumeroCiclo你正確undestood有maximum_cycle之前deferenced你可以使用它作爲數組。然而,[] - 運算符結合更緊那麼* - 運算符,這就是爲什麼這條線

*maximum_cycle[y-x]=n; 

是錯誤的,應該是這樣的:

(*maximum_cycle)[y-x]=n;