C语言 从二进制文件中阅读数据并将其存储在结构中会产生分段错误

qnakjoqk  于 2023-11-17  发布在  其他
关注(0)|答案(2)|浏览(76)

我遇到了一个“分段错误”的问题。
我正在从一个二进制文件中阅读数据,并试图将其存储在一个结构中;下面是我正在做或“尝试”做的事情的代码:

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);

}

字符串

cnwbcb6i

cnwbcb6i1#

您正在阅读nombre_docespecialida和所有其他带有fread的字符串。这很好,但它不会以'\0'字符终止字符串。您使用putsstrcpy,它们期望这些字符串以nul-terminator结束。
首先,将字符串的大小增加1。然后终止字符串:

nombre_doc[60] = '\0';

字符串

jtw3ybtb

jtw3ybtb2#

调试分段错误的最佳方法是使用调试器(如GDB)或内存分析器(如Valgrind)。
如果没有,通常在代码中添加编号的printf()语句会有所帮助。当您找到错误之前执行的最后一个printf()语句时,您可以添加更多的printf()语句并重复测试以缩小范围。
C程序中出现分段错误的几个常见原因:

  • 试图解引用一个NULL指针。如果该指针是一个函数调用的结果,如malloc()或fopen(),其输出在继续之前没有检查错误,则经常发生这种情况。
  • 超出数组或已分配块的边缘。字符串没有正确地以null结尾是导致这种情况的常见原因。如果打印字符串在屏幕上产生垃圾,这可能是原因。
  • 尝试使用已通过free()释放的内存块。

相关问题