2013-11-28 1 views
0

У меня возникла эта странная ошибка сегментации. Я пытаюсь найти, если идентификатор пациентов уже существует в списке пациентов с помощью указателей. Я думаю, что данный код:C Указания на сегментацию Fault

#include <stdio.h> 
#include <stdlib.h> 
#include "health.h" 

void addPatient(int patientID) { 
printf("here1"); 
    Chart* patients_chart; 

    // find the patient with id 
    patients_chart = patientList; 

    while(patients_chart == NULL || patients_chart->id == patientID) { 
     patients_chart = patients_chart->next; 
printf("here2"); 
    } 

printf("here3"); 

    // if patient wasn't found, add new patient 
    if (patients_chart == NULL) { 
     Chart *new_chart; 
printf("here4"); 
     // allocate and initialize new patient 
     new_chart   = (Chart*)malloc(sizeof(Chart)); 
     new_chart->id  = patientID; 
     new_chart->buffer = NULL; 

     // insert new patient into list 
     new_chart->next = patientList; 
     patientList  = new_chart; 
printf("here5"); 
    } 
} 

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

/* 
* Patient's health chart: ID + linked list of health type readings 
*/ 
typedef struct chartEntry* Chartptr; /* pointer to a Chart */ 

typedef struct chartEntry{ 
    int id;    /* patient ID */ 
    CBuffptr buffer;  /* pointer to first health type buffer */ 
    Chartptr next;   /* pointer to next patient */ 
}Chart; 


extern Chartptr patientList; 

я вызвать функцию в основном с входом как этот: 1,12: 12: 12,7,0

7-является "команда"

1 является пациентом id

Вы можете игнорировать остальные.

Я понимаю, как найти пациента, но я получаю эту неприятную сегрегатную ошибку. Спасибо за ваше время!

+0

В какой момент у вас есть segfault? Условие поиска вашего поиска не выглядит точным. – rano

+0

[Пожалуйста, не указывайте возвращаемое значение 'malloc()' in C] (http://stackoverflow.com/a/605858/28169). – unwind

+0

@unwind большое вам спасибо! Вы только что доказали свой проф. в некоторой степени. – user3043594

ответ

2

Следующий код глючит:

while(patients_chart == NULL || patients_chart->id == patientID) { 
    patients_chart = patients_chart->next; 
    printf("here2"); 
} 

Вы опережение, пока либо указатель NULL или указатель соответствует идентификатору пациента. Тебе не хватает отрицания. Вместо этого используйте:

while(patients_chart != NULL && patients_chart->id != patientID) { 
    patients_chart = patients_chart->next; 
    printf("here2"); 
} 
+0

Я пробовал, чтобы это не исправить проблему. Хотя, моя логика цикла, кажется, выключена. – user3043594

+0

Это исправило мою проблему. Но это сводилось к разыменованию указателя. – user3043594

1
while(patients_chart == NULL || patients_chart->id == patientID) { 
    patients_chart = patients_chart->next; 
} 

Вот если условие 1 (patients_chart == NULL) истинно, то вы делаете это:
patients_chart = patients_chart->next;

который является Null разыменования указателя, тем самым вызывая сегм Fault.

+0

Вот оно! patient_chart = patientList; if (patient_chart! = NULL) { while (patient_chart-> id! = PatientID) { patient_chart = patient_chart-> next; } } – user3043594