2014-03-27 3 views
-4

이 프로그램 (Collatz Conjecture)을 실행 중이 었는데 33 번 줄에서 세그먼트 오류가 발생했지만 33 번 블록은 블록의 끝에 }입니다. 스택 문제인지 나는 모른다. 도울 수 있니?Collatz의 세그먼트 오류 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

인 :이 라인

*maximum_cycle[y-x]=n; 

잘못이처럼 보이도록 해야지 왜 그러나 [] - 연산자는 즉, * - 연산자 다음 단단한 것 결합? – Bathsheba

+0

컴파일러는 심각한 문제가 있으므로이 코드에 대한 주요 경고를 제공해야합니다. 경고를 사용하도록 설정 했습니까? –

+0

다음을 읽어보십시오. http://ericlippert.com/2014/03/05/how-to-debug-small-programs/ 및 http://stackoverflow.com/questions/how-to-ask –

답변

2

당신은 단일 정수 포인터이다 hallarNumeroCirclo&maximum_cycle[MAX_NUMERO]Maximo을 전달하고 있습니다! 이것은 배열 인덱싱이 하나를 선택하기 때문이며, 그런 다음 그 주소를 취합니다.

그러나 함수에서 필요로하는 형식은 배열입니다. 쓰려고하면 알려지지 않은/매핑되지 않은 영역에 을 쓰고 프로그램을 SIGSEGVing 할 것입니다.

문제는 사실 포인터가 포인터를 전달하는 동안 포인터에 대한 포인터를 제외한 기능입니다. 포인터 배열에 할당 된 공간은 실제 정수 배열보다 작을 수 있습니다. x86에서 그들은 동일하지만, 여기에 문제는 당신의 코드가 포인터에 가짜 물건을 쓰고 다음 포인터를 역 참조하는 것이 당신을 추락시킬 것이라는 것입니다.

소스에 &maximum_cycle[MAX_NUMERO] 대신 &maximum_cycle을 사용해보십시오.

0

이 줄

int maximum_cycle[MAX_NUMERO]; 

MAX_NUMERO 요소 maximum_cycle라는 int 배열을 선언한다. 이

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

를하는

호출 된 함수에 이르기까지의 어레이 maximum_cycleMAX_NUMERO + 1 소자의 ADRESS 전달한다. C 배열은 0 기반이며, [0]은 첫 번째 요소를 주소 지정합니다.

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


는 (주소) MAX_NUMERO 요소의 int 배열에 대한 포인터를 기대하고, 그래서 이런 식으로 함수를 호출 : 올바르게 maximum_cycle 전에 deferenced 가지고 undestood hallarNumeroCiclo 내부

hallarNumeroCiclo(x,y,&maximum_cycle); 

을 그것을 배열로 사용할 수 있습니다. 라인 (33)

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