2017-10-31 4 views
-6

이 코드는 codeblocks에서 잘 실행을 제공하지만, 제공하는 이유 아래의 코드를 통해 이동이 error.Thank에 대한 해결책을 알려주세요 당신.C++ 분할 오류 :이 프로그램은 codechef의 컴파일러 런타임 (SIGSEGV) 오류를 런타임 오류 (SIGSEGV)

#include<iostream> 
using namespace std; 
int main(){ 
int t; 
long n; 
cin>>t; 
while(t--){ 
    cin>>n; 
    int i=2,m=0,j=0,a[n/2]; 
    while(i<=n/2){ 
     if(n%i==0){ 
      n=n/i; 
      a [ j++ ] = i; 
      m++; 
      i = 2; 

     } 
     else i++; 
     a[j] = n; 
    } 
    cout << m+1 << endl; 
    for(int i=0;i<=m;i++) 
     cout << a[i] << endl; 
} 
return 0; 
} 
+3

디버깅을 한 적이 있습니까? Segfault가 원인이 무엇인지 찾아 보셨습니까? – Carcigenicate

+0

어디에서 실패 했습니까?이 문제를 해결하기위한 노력은 무엇입니까? –

+0

이 코드에는 세그먼트 화 오류가 표시되지 않습니다. 하지만 일부 컴파일러에서는 배열을 선언 할 때 상수 값을 주어야한다는 언급은 가치가 있다고 생각합니다. 그렇지 않으면 컴파일러 오류가 발생합니다. – Hamed

답변

0

이것은 잘못된 메모리 참조 또는 세그먼트 오류로 인한 오류입니다. 가장 일반적인 원인은 범위를 벗어난 배열 요소에 액세스하거나 너무 많은 메모리를 사용하는 것입니다. 당신이 시도 할 수

어떤 것들은 :

당신이 초기화되지 않은 변수를 사용하지 않는 있는지 확인합니다. 이 값은 컴퓨터에서 0으로 설정 될 수 있지만 판사에게 보장되지는 않습니다.

배열 요소에 액세스하는 모든 단일 항목을 검사하고 범위 밖일 수 있는지 확인하십시오.

너무 많은 메모리를 선언하지 않았는지 확인하십시오. 64 MB가 보장되지만 크기가 [10000] [10000] 인 배열은 작동하지 않습니다.

스택 메모리를 너무 많이 선언하지 않았는지 확인하십시오. 커다란 배열은 함수 밖에서 전역 적으로 선언되어야합니다 - 함수 내부에 100000 int 배열을 넣는 것은 작동하지 않을 것입니다.

정적 메모리 할당을 사용해보십시오.

세그먼트 오류의 다른 원인의 일부를은 다음과 같습니다

  1. 가 초기화되지 않은 포인터

    에게 프로그램이하지 않는 메모리를 액세스 NULL 포인터

  2. 역 참조 사용 개인적인.

여기서 세그먼테이션 결함에 대한 자세한 내용을 볼 수 있습니다. click here

while 루프 코드도 ​​확인하십시오.

+0

대단히 고마워요.하지만 웹에서 이런 종류의 이론을 이전에 발견했습니다.왜이 프로그램의 코드가 이런 종류의 오류를 내고 있는지 말해주십시오. 또한 어떻게 해결할 수 있습니다. –