很高兴加入你的论坛。 现在,让我们走向不利;我遇到了“分段错误”错误的问题。 我正在读取二进制文件中的数据,我试图将其存储在一个结构中;继承了我正在做或正在“尝试”做的事情的代码。哈哈哈
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 :(得分:3)
您正在使用nombre_doc
阅读especialida
,fread
和所有其他字符串。这很好,但它不会终止带有'\0'
字符的字符串。您使用puts
和strcpy
期望这些字符串以nul-terminator结尾。
首先,用1增加字符串的大小。然后终止字符串:
nombre_doc[60] = '\0';
答案 1 :(得分:0)
调试分段错误的最佳方法是使用调试器(如GDB)或内存分析器(如Valgrind)。
如果没有,通常有助于在代码中添加编号的printf()语句。当您找到错误之前执行的最后一个printf()时,您可以添加更多printf()语句并重复测试以缩小范围。
C程序中分段错误的几个常见原因:
尝试取消引用NULL指针。如果所述指针是函数调用的结果,例如malloc()或fopen(),那么经常会发生这种情况,在继续之前没有检查其输出是否有错误。
超越数组或已分配块的边缘。未正确终止的字符串是这种情况的常见原因。如果打印字符串会在屏幕上产生垃圾,这可能就是原因。
尝试使用已经使用free()释放的内存块。