2017-02-16 18 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 пользователях. Иван, Петр и Гриша. Я вызываю метод printAll() и все будет хорошо. {Ivan ....., Peto ...., Grisha ....}

После того, как я могу вызвать метод addNewPacient() (Nazar), и все будет хорошо. {Ivan ....., Peto ...., Grisha ...., Nazar ....} Но когда я удаляю последний элемент из массива, все почти все будет ОКПОЛЬЗОВАТЬСЯ. {Ivan ......, Petro ....., Grisdksaldaskfpwqe ### 221 ......} Элемент прослушивания искажен. Я думаю, что у меня есть проблемы с deleteLastElement(), помощь плз)

+0

где ' объявлены пациенты? Глобальный? –

+2

'Pacient * pacients; ...' нуждается в 'Pacient' ->' struct Pacient'? – kaylum

+0

Я нашел ошибку, в pacient = (Pacient *) realloc (pacients, count * sizeof (Pacient *)); требуется удалить * после Pacient. Senq) –

ответ

2

вы правы: ваш список сжиматься код имеет проблему:

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

вы передаете размер от указателя не структуры . Вы отлично справлялись с функцией роста. Передайте фактический размер структуры или у вас будет намного меньше памяти для работы, что объясняет разбитые конечные элементы.

Теперь, когда я указал, что из, исправление легко: просто скопируйте строку выше (должен был сделать это в первую очередь или сделать макрос, чтобы избежать копирования/вставки):

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