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)看:你甚至不需要问。你发现自己:)为什么不使用列表?使用列表可以简化内存管理和记录管理(例如删除不是最后一个的条目)