2015-02-10 5 views
-3

Я начинаю с нуля. Пройдя много уроков, я не уверен, почему я получаю ошибку сегментации. Я получаю эту ошибку как для моих функций write_new_file, так и для search_by_firstname. Я думаю, что проблема заключается в аргументе типа PERSON * inrecord в моей функции write_new_file. Я уже пытался изменить его с указателя на inrecord и изменил все переменные соответственно, но проблема все еще существовала. Я спросил товарищей по классу и пока не решил.Почему возникает ошибка сегментации (ядро сбрасывается)?

//------TYPEDEFS------ 
typedef struct{ 
    char firstname[20]; 
    char famname[20]; 
    char pers_number[13]; //yyyymmddnnnc 
}PERSON; 

void write_new_file(PERSON *inrecord){ 
    FILE *ptr_myfile; 
    ptr_myfile=fopen("test.bin","w"); 
    if (ptr_myfile==NULL) 
    { 
     printf("Unable to open file!"); 
     exit(0); 
    } 
    strcpy(inrecord->firstname,"Name",20); 
    strcpy(inrecord->famname, "surname",20); 
    strncpy(inrecord->pers_number, "880192234",13); 
    fwrite(&inrecord, sizeof(PERSON), 1, ptr_myfile); 
    fclose(ptr_myfile); 

} 
void search_by_firstname(char *name){ 
    FILE *ptr_myfile; 
    ptr_myfile=fopen("test.bin","r"); 
    PERSON *temp=NULL; 
    if (ptr_myfile==NULL) 
    { 
     printf("Unable to open file!"); 
     exit(0); 
    } 

     fread(temp,sizeof(PERSON),1,ptr_myfile); 
     if(strcmp(temp->firstname,name)!=0){ 
      printf("Not found"); 
      }else{ 
       printf("found"); 
      } 

    fclose(ptr_myfile); 
} 

int main(void){ 
    PERSON *ppost=NULL; 
    write_new_file(ppost); 
    search_by_firstname("Neda"); 
    return(0); 
} 
+1

Вы вызываете 'write_new_file' с указателем' NULL'. И тогда 'write_new_file' пытается получить к нему доступ с' inrecord-> firstname'. Вам нужно выделить структуру, которую 'ppost' может указать, прежде чем передать ее в' write_new_file'. У вас такая же проблема с 'temp' в' search_by_firstname'. – lurker

ответ

1
  1. Вы derefernce в NULL указатель, в

    void write_new_file(PERSON *inrecord) 
    { 
        FILE *ptr_myfile; 
    
        ptr_myfile = fopen("test.bin","w"); 
        if (ptr_myfile == NULL) 
        { 
         printf("Unable to open file!"); 
         exit(0); 
        } 
        strcpy(inrecord->firstname, "Name", 20); 
        strcpy(inrecord->famname, "surname", 20); 
        strncpy(inrecord->pers_number, "880192234", 13); 
        fwrite(&inrecord, sizeof(PERSON), 1, ptr_myfile); 
        fclose(ptr_myfile); 
    } 
    

    Вам не нужно передать указатель на функцию записи файла, что вам нужно

    void write_new_file() 
    { 
        FILE *ptr_myfile; 
        PERSON person; 
    
        ptr_myfile = fopen("test.bin","w"); 
        if (ptr_myfile == NULL) 
        { 
         printf("Unable to open file!"); 
         exit(0); 
        } 
        strcpy(person.firstname, "Name", 20); 
        strcpy(person.famname, "surname", 20); 
        strncpy(person.pers_number, "880192234", 13); 
    
        fwrite(&person, sizeof(PERSON), 1, ptr_myfile); 
    
        fclose(ptr_myfile); 
    } 
    

    и в вашем основном вы сделаете это

    int main(void) { 
        write_new_file();  
        search_by_firstname("Neda"); 
        return(0); 
    } 
    
  2. Вы не выделить место для temp, здесь вы пытаетесь получить доступ temp

    fread(temp,sizeof(PERSON),1,ptr_myfile); 
    

    но не выделить место для этого, вам не нужно указатель здесь либо, вместо

    PERSON temp; 
    fread(&temp, sizeof(PERSON), 1, ptr_myfile); 
    
    :

    сделал бы лучшую работу, вы также можете проверить, что вам удалось выполнить fread(), прежде чем пытаться разыменовать temp, потому что иначе это приведет к неопределенному поведению.

Смежные вопросы