C中的内存(数组结构)

C中的内存(数组结构),c,memory,realloc,calloc,C,Memory,Realloc,Calloc,我有一个动态的结构数组 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;

我有一个动态的结构数组

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*));
}
对于start,我输入关于(示例)3个用户的信息。伊万、佩特罗和格里沙。 我调用printAll()方法,一切正常{Ivan….,Peto….,Grisha….}

在我可以调用addNewPacient()方法(Nazar)之后,一切都会好起来的{Ivan….、Peto….、Grisha….、Nazar….} 但当我从数组中删除最后一个元素时,一切都会很好。 {Ivan……,Petro……,Grisdksaldaskfpwqe####221……} 倒数元素扭曲。
我想我对deleteLastElement()有问题,帮助plz)

你说得对:你的列表收缩代码有问题:

pacients = (Pacient*)realloc(pacients, count * sizeof(Pacient*));
您传递的是指针的大小,而不是结构的大小。你在生长功能方面做得很好。传递结构的实际大小,否则要使用的内存会少得多,这就解释了被破坏的最终元素

现在,我已经指出,修复很简单:只需复制上面的行(首先应该这样做,或者执行宏以避免复制/粘贴):


您是对的:您的列表收缩代码有一个问题:

pacients = (Pacient*)realloc(pacients, count * sizeof(Pacient*));
您传递的是指针的大小,而不是结构的大小。你在生长功能方面做得很好。传递结构的实际大小,否则要使用的内存会少得多,这就解释了被破坏的最终元素

现在,我已经指出,修复很简单:只需复制上面的行(首先应该这样做,或者执行宏以避免复制/粘贴):


pacients
在哪里声明?全球?
Pacient*pacients需要
Pacient
-->
struct Pacient
?我在pacients=(Pacient*)realloc(pacients,count*sizeof(Pacient*))中发现了bug;需要在Pacient之后删除*。Senq)看:你甚至不需要问。你发现自己:)为什么不使用列表?使用列表,您可以简化内存管理和记录管理(例如删除一个不是最后一个的条目),在哪里声明了
pacients
?全球?
Pacient*pacients需要
Pacient
-->
struct Pacient
?我在pacients=(Pacient*)realloc(pacients,count*sizeof(Pacient*))中发现了bug;需要在Pacient之后删除*。Senq)看:你甚至不需要问。你发现自己:)为什么不使用列表?使用列表可以简化内存管理和记录管理(例如删除不是最后一个的条目)