2014-05-17 5 views
-3

fscanf를 사용하여 화면의 모든 문자를 읽고 인쇄하려고 시도하지만 세그먼트를 실행할 때 분할 오류가 발생합니다 프로그램.fscanf를 사용하여 포인터를 읽을 때 세그먼트 오류 (코어 덤프)가 발생했습니다.

./myprog input.txt 

파일 input.txt이 포함되어 있습니다 :이 같은 인수로 파일을 제공

#include <stdio.h> 

main(int argc, char * argv[]) { 
    int *a ; 
    FILE *input; 

    if (argc>=2) { 
     input= fopen(argv[1],"r"); 

     if (input!=NULL) { 
      while (feof(input)==0) { 
       fscanf(input,"%d\n",a); 
       printf("%d\n",*a); 
      } 
      fclose(input); 
     } else { 
      printf("Error!\n"); 
     } 
    } 
} 

: 여기 내 코드의 a가 가리 키도록 초기화되지 않은 변수

23 
47 
55 
70 

답변

3

유효한 메모리 주소

따라서 잘못된 메모리 주소를 가리킬 가능성이 큽니다.

다음
int *a = malloc(sizeof(int)); 
... 
free(a); // when done using it 

가 그것을 해결하는 또 다른 방법 : 여기

는 문제를 해결하는 한 방법입니다

int b; 
int *a = &b; 

하지만 난 당신이 단계 아래의 순서에 따라 제안 더 간단하고 깨끗하게 ...


이 변경 :

int *a; 

이 사람 :

int a; 

그리고이 :

fscanf(input,"%d\n",a); 

을이 사람 :

int *a; 

다음 a포인터이지만, 현재는 어디 가리 키지 않는 :

fscanf(input,"%d\n",&a); 
2

당신은 쓸 때.

fscanf에 제공하기 전에 int에 유효한 저장 장치를 지정해야합니다. 예를 들어

, main() 내부 :

int b; 
a = &b; 
fscanf(input,"%d\n",a); 

는 또한 루프가 잘못된 것입니다. feof을 사용하는 것은 거의 항상 오류입니다 (루프 조건으로 만). 대신 실제 읽기 작업을 테스트해야합니다. 귀하의 경우 :

while (1 == fscanf(input,"%d\n",a)) 
{ 
    printf("%d\n", a); 
} 
+0

첫 번째 문장 설명은 거짓입니다.'int * a;'로 선언 된 변수는 ** static ** 변수, 예를 들어 모듈의 전역 범위에 정의 된 변수 (즉, 함수 밖)에 정의 된 변수 인 경우 null 포인터로 초기화됩니다. 그러나 여기에서 논의 된 경우 변수는'main()'함수 안에서 선언되므로 자동 변수이므로 초기화 할 필요는 없습니다. 결과적으로, 아무 것도 존재하지 않거나 적어도 접근 할 수없는 메모리 영역을 가리키며, 따라서 지적 된 영역을 읽으면 세그먼트 화 예외가 발생합니다. – CiaPan

+0

죄송합니다. OP의 코드를 잘못 읽었을 것입니다.'int * a;'가'main()'앞에 있다고 생각했습니다. –