2014-03-31 3 views
0
#include <stdio.h> 
int main() 
{ 
    char memf[10000]; 
    int memlen, vn , vw,vh,fattime , posit , speed , interval , nattacks,time=0,qa=0,ninit=0,elxan; 
    scanf("%d\n",&memlen); 
    scanf("%d\n",&vn); 
    scanf("%d %d %d %d %d %d %d",&vw,&vh,&fattime,&posit,&speed,&interval,&nattacks); 

     while(nattacks>ninit) 
     { 
      if(time==fattime) 
      { 
       for(elxan=posit;elxan<=posit+vw;elxan=posit++) 
       { 
        memf[elxan]=vh; 
       } 
       posit=posit+speed; 
       time++; 
       ninit++; 

      } 
      else if(time>fattime) 
      { 
       for(qa=0;qa<100000;qa++) 
       { 
        if(ninit==nattacks) 
         break; 
        else if(qa%interval==0) 
        { 
         for(elxan=posit;elxan<=posit+vw;elxan=posit++) 
         { 
          memf[elxan]=vh; 
         } 
         posit=posit+speed; 
         time++; 
         ninit++; 
        } 


        else 
         posit=posit+speed; 
        } 
      } 
      else 
      { time++; 
       posit=posit+speed; 

      } 
     } 
    /*for(px=0;px<=memlen;px++) 
    { 
     if(memf[px]=='0') 
      memf[px]=1; 
    }*/ 



    printf("%s",memf); 
    return 0; 
} 

이 코드를 실행하는 동안 segmentation fault:11이 표시됩니다. 배열과 관련이 있다는 것을 알고 있습니다. 실수는 무엇입니까?C 세그먼트 화 오류 : 11

+0

테스트 값은 무엇입니까? – fritzone

+0

vw에 입력하는 값이 10000보다 작습니까? 입력하는 데이터를 표시 할 수 있습니까? –

+1

다음과 같은 오류를 찾는 데 유용한 세 가지 방법은 1) 디버거를 사용하여 코드를 실행하는 2) 프로그램에서 사용하는 값을 모니터링하는 printf 문을 추가하는 것 3) assert 명령문을 추가하여 배열의 끝 (내가 강하게 의심하는 것은이 경우 문제입니다). – Edward

답변

2

이 루프는 입력 된 초기 값이 합리적이라고 가정하고도 memf 어레이 외부의 메모리를 액세스하고 액세스하는 것으로 거의 보장된다고 생각합니다.

for(elxan=posit;elxan<=posit+vw;elxan=posit++) { 
    memf[elxan]=vh; 
} 

각 반복 posit+vw에 대한 테스트 만 positvw에 대한 병적 인 값을 제외하고 입력 posit의 이전 값으로 elxan 세트를 유지하면서 각각의 반복도 posit를 증가, 진정한 항상 조건을 보장, 반복은 sizeof(memf) 반복 내에서 끝나지 않습니다.

elxan이 충분히 크면 배열의 선언 된 크기를 벗어나는 메모리에 액세스하면 문제가 발생할 수 있습니다. 일반적으로 거의 모든 것이 발생할 수있는 "정의되지 않은 동작"을 호출했지만 세그먼테이션 결함의 특정 증상은 결국 배열 범위를 초과하는 것으로 예상되는 것과 매우 일치합니다.

+0

네 말이 맞아! 당신의 도움을 주셔서 감사합니다 – user3482695

2

는 다음과 같은 오류를 처리하는 방법은 다음과 같습니다

먼저, #include <assert.h>를 추가합니다. 그런 다음 배열을 읽거나 배열에 할당 할 때마다 먼저 범위 내에서 인덱싱하고 있는지 테스트하십시오. 예를 들어,이 라인 :

memf[elxan]=vh; 

다음 행으로 변경해야합니다

assert(0 <= elxan && elxan < 10000); 
memf[elxan]=vh; 

이 오류 당신에게 핀 포인트를 도움이 될 것입니다.


당신은 일반적으로 다른 C-프로그램에 많은 asserts 표시되지 않는 것을 알 수 있습니다. 괜찮아; 일단 C를 쓰는 것에 익숙해지면, 그 중 일부는 안전하게 보내 줄 수 있습니다. 처음에는 매우 도움이 될 것입니다.

+0

감사합니다! 그것은 참으로 매우 유용합니다! – user3482695