2013-02-28 3 views
2

이 함수는 사전에서 단어를 읽고 링크 된 목록의 해시 테이블에 넣는 "load"함수입니다. 행을 읽고 new_node-> 텍스트에 저장하려고하면 컴파일러가 분할 오류를 반환하고 이유를 모르겠습니다. strncpy를 사용하면 오류가 발생합니다.strncpy의 분할 오류 - 사전로드

#define HASHTABLE_SIZE 76801 


typedef struct node 
{ 
     char text[LENGTH+1]; 
     //char* text; 
     //link to the next word 
     struct node* next_word; 
} 
node; 


    node* hashtable[HASHTABLE_SIZE]; 

    bool load(const char* dictionary) 
    { 
     FILE* file = fopen(dictionary,"r"); 
     unsigned long index = 0; 
     char str[LENGTH+1]; 

     if(file == NULL) 
     { 
      printf("Error opening file!"); 
      return false; 
     } 

     while(! feof(file)) 
     { 
      node * new_node = malloc(sizeof(node)+1000); 


      while(fscanf(file,"%s",str) > 0) 
      { 
       printf("The word is %s",str); 
       strncpy(new_node->text,str,LENGTH+1); 
       //strcpy(new_node->text,str); 

       new_node->next_word = NULL; 
       index = hash((unsigned char*)new_node->text); 

       if(hashtable[index] == NULL) 
       { 
        hashtable[index] = new_node; 
       } 
       else 
       { 
        new_node->next_word = hashtable[index]; 
        hashtable[index] = new_node; 
       } 

       n_words++; 

      } 
      //free(new_node); 



     } 
     fclose(file); 
     loaded = true; 

     return true;  
    } 
+3

'strncpy'는 문자열을 종료하지 않을 수 있으므로주의해야합니다. 그리고 노드에 1000 바이트를 추가로 할당하는 이유는 무엇입니까? –

+2

또한 디버거를 사용하여 충돌이 발생한 위치를 확인하십시오. 또한 호출 스택을보고 충돌이 어디에서 발생했는지 확인하고 충돌 원인을 파악하는 데 도움이되는 변수를 검토 할 수 있습니다. –

+0

'node * new_node = malloc (sizeof (node) +1000);'무엇? 왜 여분의 1000 바이트? –

답변

5

코드를 한 줄씩 살펴 보겠습니다.

while(! feof(file)) 
    { 

feof를 사용할 수있는 권리 방법이 아니다 - 바로 여기에 StackOverflow에 게시 Why is “while (!feof (file))” always wrong?을 확인하십시오.

 node * new_node = malloc(sizeof(node)+1000); 

음, 좋아. 우리는 하나의 노드와 1000 바이트를위한 공간을 할당한다. 이상하게 들리지만 어 ... RAM은 싸다.

 while(fscanf(file,"%s",str) > 0) 
     { 

음 ... 다른 루프? 확인 ...

  printf("The word is %s",str); 
      strncpy(new_node->text,str,LENGTH+1); 
      //strcpy(new_node->text,str); 

      new_node->next_word = NULL; 
      index = hash((unsigned char*)new_node->text); 

안녕하세요!

좋아, 그럼 처음 :

  if(hashtable[index] == NULL) 
      { 
       hashtable[index] = new_node; 
      } 
      else 
      { 
       new_node->next_word = hashtable[index]; 
       hashtable[index] = new_node; 
      } 

이 두 단어는 같은 양동이에 해시하는 초 가정 ... 우리가 반복적으로 new_node을 덮어 계속이 두 번째 루프에서 초를 기다려 ... 루프를 통해 hashtable[index]NULL을 가리키고 new_node을 가리 키도록 설정합니다. 및 hashtable[index]new_node를 가리 키도록 할 것이다)

루프를 통해 두 번째로, hashtable[index]하지 NULL 너무 new_node은 (new_node 힌트)에 어떤 hashtable[index] 지점을 가리 키도록 할 것이다.

무엇이 ouroboros인지 아십니까? 버킷의

하나는 지금 잘못된 정보를 포함 :

지금 그들은 같은 버킷 해시하지 않는 가정합니다. 버킷 1에서 "hello"를 먼저 추가하고 버킷 2에서 "작별 인사"를 먼저 추가하면 버킷 1을 트래버스하려고 할 때 (연결 코드가 깨 졌기 때문에) 버킷 1에 속하지 않은 "안녕"을 찾을 수 있습니다. 모든.

에 새로 노드를 추가해야합니다. 추가 할 단어는 모두입니다. 동일한 노드를 재사용하지 마십시오.

+1

'feof'를 사용하는 루핑은 거의 항상 잘못된 것입니다. 이 프로그램은 이러한 경우 중 하나입니다. –

+0

물론 당신은 맞습니다. 나는 그것을 완전히 놓쳤다. 소식이 수정되었습니다. –