2012-10-15 2 views
1
16  char* input = (char*) argv[1]; 
17  FILE *fp = fopen (input, "r"); 
18  if(fp == NULL) 
19  { 
20   printf(" reading input file failed"); 
21   return 0; 
22  } 
23  fseek(fp,0,SEEK_END); 
24  int file_size = ftell(fp); 
29  rewind(fp); 
30  int i; 
31  int totalRun; 
32  char * temp; 
33  char* model; 
34  char* example; 
36  fscanf(fp,"%d",&totalRun); 
37  fscanf(fp,"%s",model); 
을받은

위는fscanf() 세그 폴트 프로그램은 신호 EXC_BAD_ACCESS

프로그램이 신호를받은 나는 37 행에서이 오류가 내 코드 "fscanf (FP,"% S ".MODEL)"입니다 EXC_BAD_ACCESS, 메모리에 액세스 할 수 없습니다. 이유 : KERN_PROTECTION_FAILURE 주소 : 0x00007fff5fc00730 0x00007fff8db20bcb in __svfscanf_l()

이 문제의 원인은 무엇입니까 ?? 나는 gdb에서 * fp를 들여다 보았다. totalRun _offset = 0을 읽고 _offset = 4096을 읽은 후 totalRun의 내용이 정확했습니다 ("3"). 한 줄만 읽고 왜 4096 오프셋입니까? 또한 FILE에서 참조하는 _blksize는 무엇입니까?

당신은 model 메모리를 할당 할 필요가
+2

'모델'에는 메모리가 할당되지 않습니다. 즉 malloc을 수행합니다. –

답변

2

, 그것이 초기화되지 않은 포인터 감사드립니다. fscanf()model에 지정된 배열 이상으로 읽지 않도록하십시오. model을 동적으로 할당 할 필요가 없다면 로컬 배열을 사용하십시오. 예를 들어 : fscanf()에 대한 호출이 실패 할 경우

char model[1024]; 
if (1 == fscanf(fp, "%1023s", model)) 
{ 
} 

항상 체크 성공적인 과제의 수를 반환 fscanf()의 반환 값은, 그렇지 않으면 프로그램은 초기화되지 않은 변수를 처리합니다.

1

변수 model은 초기화되지 않습니다. fscanf() 메소드에서 사용하려면 먼저 메모리를 할당해야합니다. 두 가지 방법으로 수행 할 수 있습니다 정적

  1. -char model[1024];
  2. 동적 - char * model = (char*) malloc(1024);이 작업이 완료되면 버퍼 할당을 해제 free()를 사용하는 것을 잊지 마십시오.
관련 문제