Помощь со структурой (ошибка сегментации) - PullRequest
0 голосов
/ 06 декабря 2010

Я рад присоединиться к вашему форуму.Теперь давайте перейдем к нижней стороне;У меня проблемы с ошибкой сегментации.Я читаю данные из двоичного файла, который я пытаюсь сохранить в структуре;Вот код того, что я делаю или пытаюсь сделать.хахаха

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

}

Спасибо заранее.Хорошего дня

Ответы [ 2 ]

3 голосов
/ 06 декабря 2010

Вы читаете nombre_doc, especialida и все другие строки с fread. Это нормально, но не завершает строки символом '\0'. Вы используете puts и strcpy, которые ожидают, что эти строки заканчиваются нулевым терминатором.

Сначала увеличьте размер строк на 1. После этого завершите строки:

nombre_doc[60] = '\0';
0 голосов
/ 06 декабря 2010

Лучший способ отладить ошибку сегментации - это использовать отладчик, такой как GDB, или анализатор памяти, такой как Valgrind.

Если один из них недоступен, он обычно помогает добавлять нумерованные операторы printf ()код.Когда вы найдете последнюю функцию printf (), которая была выполнена перед ошибкой, вы можете добавить дополнительные операторы printf () и повторить тесты, чтобы сузить его.

Несколько распространенных причин ошибки сегментации в программе на C:

  • Попытка разыменования пустого указателя.Это часто случается, если указатель является результатом вызова функции, такой как malloc () или fopen (), чей вывод не был проверен на наличие ошибок перед продолжением.

  • Выход за пределы границмассив или выделенный блок.Строки, которые не заканчиваются нулем должным образом, являются частой причиной этого.Если при печати строки на экране появляется мусор, это может быть причиной.

  • Попытка использовать блок памяти, который уже был освобожден с помощью free ().

...