2013-12-22 5 views
0

여기 한 시간 동안 붙어 있습니다. 왜 파일 포인터가 null이 아닌 경우 세그먼트 화 오류가 발생하는지 알지 못합니다. 누구 plz 도와주세요.내 파일 포인터가 null이 아닌 동안 fscanf가 세그먼테이션 오류를 반환합니다.

int load(char* dictionary){ 
char* word = ""; 
FILE* fp=fopen(dictionary,"r"); 
if (fp!= NULL) 
{ 
    while (fscanf(fp,"%s",word) != EOF) // **getting segmentation fault** 
    { 
     hash_put(word); 
    } 
} 
else 
{ 
     return false; 
} 
fclose(fp); 
return true;} 
+0

문자열을 저장할 영역을 확보해야합니다. – BLUEPIXY

+0

또한 상수 문자열의 값을 수정할 수 없습니다. – George

답변

0

word 그 데이터를 저장하기 위해 어떤 메모리를 사용해보십시오.

즉 배열 - 시도

char data[100]; 
+0

해당 변경으로 인해 segault가 발생하지 않음 –

1

당신이 다른 무엇을 기대 하는가? 문자열 리터럴의 읽기 전용 메모리에 쓰는 것은 허용되지 않습니다. 당신은 몇 가지 읽기/쓰기 메모리를 할당해야

... 예 : malloc (끝 free하는 것을 잊지 마세요), 또는 스택 문자 문제는 파일 포인터를하지 data[1024];

1

에; 문제는 귀하의 word 변수입니다. 당신 만 0 터미네이터위한 공간이있는 문자열 리터럴 ("")를 가리 키도록 word을 설정 한

. 문자열 리터럴의 내용을 수정하려고하면 정의되지 않은 동작이 호출됩니다. 이것과 더불어 리터럴의 끝을 지나서 물건을 저장하려고한다는 사실에 더하여 코드가 손상되는 이유가됩니다.

배열이 늘어나서 추가 데이터를 수용 할 수 없습니다. 데이터를 읽으 려하기 전에 데이터를 저장하기에 충분한 메모리를 할당해야합니다.

#define WORD_SIZE ... // large enough to hold the largest word in your file 
char word[WORD_SIZE]; 
... 
while (fgets(word, sizeof word, fp)) 
{ 
    // do stuff with word 
} 
관련 문제