2017-11-26 1 views
0

DDD를 사용하는 것은 처음이고 문제의 주제가 매우 재미 있습니다 (유닉스 환경의 c). 그래서 뭔가를 간과 할 수 있습니다. 일반 gcc 컴파일에서 발생하지 않는 파일에서 fscanf를 시도 할 때 세그먼트 화 오류가 발생합니다. 이 함수는 다음DDD (데이터 표시 디버거)를 사용하는 동안 SIGSEV

프로그램 신호 SIGSEGV 세그멘테이션 오류받은 :

void read_config(){ 
    FILE *fp; 
    fp = fopen("config.txt","r"); 
    fscanf(fp,"TRIAGE=%dDOCTORS=%dSHIFT_LENGTH=%dMQ_MAX=%d ",&data.triage,&data.doctors,&data.shift,&data.mq_max); 
} 

및 fscanf 라인이 DDD에 다음 메시지를 제공 읽은 후

. /lib/i386-linux-gnu/lib.so.6

에서 __isoc99_fscanf()에서 0xb7e58e1e 나는이 문제의 원인이 될 수있는 무엇을 알아낼 수 없습니다. 미리 감사드립니다!

+0

입력 파일이 scanf에 적합한 지 확인하고 인수로 주어진 포인터가 유형에 맞는지, 그리고 저장해야하는 것을 저장할 충분한 공간이 있는지 ... Btw fgets + strtok을 사용하는 것이 더 좋다 –

+0

파일에 ' 현재 디렉토리에 존재하지 않거나 그것을 읽을 수 없습니까? (errno/perror는 여러분의 친구입니다) – wildplasser

+0

@wildplasser 파일은 실행 파일 및 c 파일과 같은 디렉토리에 있습니다. chmod ("config.txt", 0644);를 추가하여 권한이 있는지 확인하십시오 주문. 또한 if (fscanf (fp, "TRIAGE = % dDOCTORS = % dSHIFT_LENGTH = % dMQ_MAX = % d", & data.triage, & data.doctors, & data.shift, & data.mq_max == EOF) { perror "파일에서 읽을 수 없습니다"); }' – NUGA

답변

0

이 문제의 원인을 파악할 수 없습니다.

디버거에서 fp 값을 찾습니다. NULL이됩니다.

항상의 회신 값을 확인하십시오. 시스템 기능을 호출하십시오.

파일은 문제가되지 않습니다 실행

과 같은 디렉토리에 있습니다. 중요한 점은 fopen으로 전화 할 때 현재 디렉토리가 무엇인지입니다.

DDDconfig.txt이있는 디렉토리로 변경하라는 메시지가 표시되지 않으면 DDD이 다른 디렉토리에서 실행 중일 가능성이 있습니다.

+0

그게 문제였습니다. 감사! 꽤 당혹 스럽네요. 신참 같은 실수 였지만, 결코 다시는 그런 일이 일어나지 않을 것입니다. 다시 한번 감사드립니다. – NUGA

관련 문제