2010-12-05 85 views
0

我很高興加入您的論壇。 現在,讓我們來看下面的情況;我有'分段錯誤'錯誤的問題。我從一個二進制文件讀取數據,我試圖存儲在一個結構中;繼承了我在做什麼或「試圖」做什麼的代碼。哈哈哈幫助結構(分段故障)

struct Medico //users are medics 
{ 
    int Id_Doctor; //Id User 
    int Estado; //status of the user 
    char Nombre[60]; //name of the user 
    char Clave_Acceso[20]; //password of the user 
    char Especialidad[40]; //especialty of the user 
    struct Medico *next; 
}; 

void Cargar_Datos() //load files 
{ 
    FILE *Archivaldo; ///file- Archivo means file 
    struct Medico * head = NULL; 
    struct Medico * prev, *current; 
    char especialida[40], password[20]; ///locals for specialty and password 
    char nombre_doc[60]; ///local for name 
    int estado_doc, id_doc; // local for status 

    if((Archivaldo=fopen("md.dat", "a+b"))==NULL) 
    { 
     printf("No se pudo abrir el archivo de Medicos\n"); 
     exit(1); 
    } 
    rewind(Archivaldo); 
    current = (struct Medico *) malloc (sizeof(struct Medico)); 

    fread(&id_doc, sizeof(int), 1, Archivaldo); 
    fread(nombre_doc, sizeof(char), sizeof(nombre_doc), Archivaldo); 
    fread(password, sizeof(char), 20 , Archivaldo); 
    fread(especialida, sizeof(char), 40, Archivaldo); 
    fread(&estado_doc, sizeof(int), 1, Archivaldo); 

    printf("ID: %d\n", id_doc); 
    printf("\nDoctor: "); 
    puts(nombre_doc); 
    printf("\nPassword: "); 
    puts(password); 
    printf("\nEspecialidad: "); 
    puts(especialida); 
    printf("\nEstado: "); 
    if(estado_doc==1) 
    puts("Activo\n"); 
    else 
    puts("Inactivo\n"); 
    current->Id_Doctor=id_doc; 
    strcpy(current->Nombre, nombre_doc); 
    strcpy(current->Clave_Acceso, password); 
    strcpy(current->Especialidad, especialida); 
    current->Estado=estado_doc; 
    current=current->next; 

    fclose(Archivaldo); 

} 

感謝先進。祝你有個美好的一天

+0

請重新格式化您的消息,以便代碼具有正確的縮進。現在它是不可讀的。 – thkala 2010-12-05 22:16:17

+0

也請嘗試將你的例子減少到能夠重現錯誤的最小代碼(這在任何情況下都是很好的調試技術)。並指定segfault正在發生的位置(通過在調試器中運行找到它)。 – 2010-12-05 22:19:06

回答

0

調試段錯誤的最好辦法是使用調試器,如GDB或內存分析器如Valgrind的。

如果其中一個不可用,通常會幫助在代碼中添加編號的printf()語句。當你發現在錯誤發生之前執行的最後一個printf()時,你可以添加更多的printf()語句並重複測試來縮小它的範圍。

在C程序段故障的幾個常見原因:

  • 試圖取消引用NULL指針。如果所述指針是諸如malloc()或fopen()之類的函數調用的結果,那麼往往會發生這種情況,在繼續之前,其輸出未檢查錯誤。

  • 超越數組或分配塊的邊緣。正確無效的字符串是這種情況的常見原因。如果打印字符串在屏幕上產生垃圾,這可能是原因。

  • 嘗試使用已使用free()釋放的內存塊。

3

您正在閱讀nombre_doc,especialida和其他fread的其他字符串。這很好,但它不會以'\0'字符終止字符串。您使用putsstrcpy期望這些字符串以nul終結符結束。

一是加大串的大小與1之後終止您的字符串:

nombre_doc[60] = '\0';