2010-12-05 90 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';