2017-02-16 5 views
0

Ich habe dynamische Array von Strukturen.Speicher in C (Array-Strukturen)

struct Pacient 
{ 
    char name[30]; 
    char surname[30]; 
    char middleName[30]; 
    char nationality[30]; 
    float height; 
    float weight; 
    char phone[30]; 
    struct Date { 
     int day; 
     int month; 
     int year; 
    }dateOfBirth; 
    struct Adress { 
     char city[30]; 
     char street[30]; 
     int numberOfHouse; 
    } adress; 
    struct Hospital { 
     int numberOfHospital; 
     char nameOfOffice[30]; 
     int numberOfMedicalCart; 
     char groupOfBlood[10]; 
     char nameOfDiagnosis[30]; 
    }hospitalInfo; 
}; 

Ich brauche hinzufügen, löschen Element aus Array.

Pacient* pacients; 
pacients = (Pacient*)calloc(count, sizeof(Pacient)); 

^meine Deklaration von Array, Anzahl - Größe des Arrays.

Ich machte func addNewPacient und deleteLastElement.

void addNewPacient() { 
    count++; 
    pacients = (Pacient*)realloc(pacients, sizeof(Pacient)*count); 
    ......//many scanf... 
} 
void removeLastElement() { 
    count--; 
    pacients = (Pacient*)realloc(pacients, count * sizeof(Pacient*)); 
} 

Für Start, i Eingang Informationen über (Beispiel) 3 Benutzer. Ivan, Petro und Grisha. Ich rufe Methode printAll() und alles in Ordnung. {Ivan ....., Peto ...., Grischa ....}

Nachdem ich Methode addNewPacient() aufrufen können (Nazar) und alle wieder in Ordnung sein wird. {Ivan ....., Peto ...., Grisha ...., Nazar ....} Aber wenn ich das letzte Element aus dem Array entfernen, werden alle fast FAST FAST. {Ivan ......, Petro ....., Grisdksaldaspfpwqe ### 221 ......} Penult Element verzerrt. Ich glaube, ich habe ein Problem mit deleteLastElement(), Hilfe plz)

+0

wo ist ' Pacients erklärt? global? –

+2

'Pacient * pazients; ...' braucht 'Pacient' ->' struct Pacient'? – kaylum

+0

Ich habe einen Fehler gefunden, in Pacients = (Pacient *) realloc (Pacients, count * sizeof (Pacient *)); brauche * nach Pacient löschen. Senq) –

Antwort

2

Sie haben Recht: Ihre Liste Code schrumpfen hat ein Problem:

pacients = (Pacient*)realloc(pacients, count * sizeof(Pacient*)); 

Sie die Größe des Zeiger vorbei nicht von der Struktur. Sie haben sich gut für die Wachstumsfunktion gemacht. Übergeben Sie die tatsächliche Größe der Struktur oder Sie haben viel weniger Arbeitsspeicher, mit dem Sie arbeiten können, was die zerstörten Endelemente erklärt.

Nun, da ich, dass darauf hingewiesen, das Update ist einfach: die Zeilen kopieren oben (sollte in erster Linie oder ein Makro durchgeführt, um das Kopieren/Einfügen zu vermeiden getan hat, dass):

pacients = realloc(pacients, count * sizeof(Pacient));