2017-02-16 82 views
0

我有動態的結構數組。C中的內存(陣列結構)

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

我需要添加,從數組中刪除元素。

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

^我的數組聲明,count - 數組的大小。

我做了func addNewPacient和deleteLastElement。

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

首先,我輸入有關(例子)3用戶的信息。 Ivan,Petro和Grisha。 我調用方法printAll(),一切都很好。 {Ivan .....,Peto ....,Grisha ....}

我可以調用方法addNewPacient()(Nazar)後,所有的都會再次罰款。 {Ivan .....,Peto ....,Grisha ....,Nazar ....} 但是當我從數組中刪除最後一個元素時,幾乎所有元素都幾乎沒事。 {Ivan ......,Petro .....,Grisdksaldaskfpwqe ### 221 ......} Penult元素扭曲。 我認爲我有問題,deleteLastElement(),幫助PLZ)

+0

哪裏是' pacients'聲明?全球? –

+2

'Pacient * pacients; ...''需要'Pacient' - >'struct Pacient'? – kaylum

+0

我發現了bug,在pacients =(Pacient *)realloc(pacients,count * sizeof(Pacient *));需要在Pacient之後刪除*。 Senq) –

回答

2

你是對的:你的名單縮減代碼有一個問題:

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

你傳遞的指針不是大小的結構。你爲增長功能做得很好。傳遞結構的實際大小,或者你的內存要少得多,這就解釋了被破壞的結束元素。

現在,我指出了這一點,該修補程序很簡單:只需複製線以上(應該做的是,在第一個地方或做一個宏,以避免複製/粘貼):

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