Pointers memcpy没有在结构中复制数据
我是新的c程序员。我正在开发一个小的学生数据库。数据库由structs student组成。每个学生都有名字、姓氏和入学号。一种方法是删除一个有预科号的学生。所以我在动态数组中搜索入学号。然后我尝试将要删除的元素之前的元素和要删除的元素之后的元素复制到另一个动态数组中。第一个问题是复制过程。虽然我使用memcpy,但它不起作用。当我有三个元素并删除一个元素时,我发现两个结构没有信息。我的意思是temp中的2个空结构不包含任何信息(比如lastname…)。我不知道为什么memcpy不工作。 第二个问题是在我试图释放动态内存时出现的分段错误。我所做的是在将新结构复制到temp之后。我有免费的db。然后我设置db=temp。所以db通常指向新的动态数组。但我也得到了分段错误,这里是代码:Pointers memcpy没有在结构中复制数据,pointers,struct,memcpy,Pointers,Struct,Memcpy,我是新的c程序员。我正在开发一个小的学生数据库。数据库由structs student组成。每个学生都有名字、姓氏和入学号。一种方法是删除一个有预科号的学生。所以我在动态数组中搜索入学号。然后我尝试将要删除的元素之前的元素和要删除的元素之后的元素复制到另一个动态数组中。第一个问题是复制过程。虽然我使用memcpy,但它不起作用。当我有三个元素并删除一个元素时,我发现两个结构没有信息。我的意思是temp中的2个空结构不包含任何信息(比如lastname…)。我不知道为什么memcpy不工作。 第二
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef int bool;
#define true 1
#define false 0
struct student{
char lastname[20];
char firstname[20];
int mNr;
char courseOfStudy[20];
char nationality[20];
};
struct student * db;
struct student * ptrDb;
int size=0;
void createDb(int s){
size=s;
db= (struct student *)malloc(100*sizeof(struct student *));
ptrDb=db;
printf("database was created\n");
}
struct student getData(char lastname [], char firstname[], int matNr, char courseOfStudy [], char nationality []){
struct student st;
memcpy(st.lastname,lastname,strlen(lastname));
memcpy(st.firstname,firstname,strlen(firstname));
st.mNr=matNr;
memcpy(st.courseOfStudy,courseOfStudy, strlen(courseOfStudy));
memcpy(st.nationality,nationality,strlen(nationality));
printf("%s,%s,%d\n",st.lastname,st.firstname,st.mNr);
return st;
}
//coping input by reference
void insert_student(struct student * st){
*ptrDb=*st;
ptrDb++;
}
bool delete_entry(int matNr){
int new_size=size-1;
int indexToRemove;
int i;
printf("look for the matriculation number: %d in the Database:\n",matNr);
for (i=0;i<size;i++){
if((db+i)->mNr==matNr){
printf("student found\n");
printf("new database size: %d:\n",new_size);
indexToRemove=i+1;
struct student * temp = (struct student *) malloc((new_size)*sizeof(struct student));
memcpy(temp,db,indexToRemove-1);// copy all elements before indexToRemove
memcpy(temp+indexToRemove,db+indexToRemove+1,size-indexToRemove+1);//copy all elements after indexRemoved
int j=0;
for(j=0;j<new_size;j++){
puts("YES");
printf("lastname: %s, firstname:%s, enrollment nr:%d\n",(temp+j)->lastname,(temp+j)->firstname,(temp+j)->mNr);
}
free(db);//free the old dynamic memory
db=temp;//now db is pointing to the new dynamic memory
free(temp);//I dont need temp any more, free it
return 1;
}
}
return 0;
#包括
#包括
#包括
typedef int bool;
#定义真1
#定义false 0
结构学生{
char lastname[20];
charfirstname[20];
int mNr;
charcourseofstudy[20];
查尔族[20];
};
struct student*db;
结构学生*ptrDb;
int size=0;
void createDb(int s){
尺寸=s;
db=(结构学生*)malloc(100*sizeof(结构学生*);
ptrDb=db;
printf(“已创建数据库”);
}
struct student getData(char lastname[],char firstname[],int matNr,char courseOfStudy[],char national[])){
结构学生;
memcpy(st.lastname、lastname、strlen(lastname));
memcpy(st.firstname、firstname、strlen(firstname));
st.mNr=材料编号;
memcpy(st.courseOfStudy、courseOfStudy、strlen(courseOfStudy));
memcpy(st.国籍、国籍、斯特伦(国籍));
printf(“%s,%s,%d\n”,st.lastname,st.firstname,st.mNr);
返回st;
}
//参考输入法
无效插入学生(结构学生*st){
*ptrDb=*st;
ptrDb++;
}
bool delete_条目(内部材料){
int new_size=size-1;
int-indexToRemove;
int i;
printf(“在数据库中查找入学号:%d:\n”,matNr);
对于(i=0;imNr==matNr){
printf(“找到的学生”);
printf(“新数据库大小:%d:\n”,新大小);
indexToRemove=i+1;
结构学生*临时=(结构学生*)malloc((新大小)*大小(结构学生));
memcpy(temp,db,indexToRemove-1);//在indexToRemove之前复制所有元素
memcpy(temp+indexToRemove,db+indexToRemove+1,size-indexToRemove+1);//删除索引后复制所有元素
int j=0;
对于(j=0;jlastname,(temp+j)->firstname,(temp+j)->mNr);
}
释放(db);//释放旧的动态内存
db=temp;//现在db指向新的动态内存
免费(临时);//我不再需要临时工了,免费吧
返回1;
}
}
返回0;
}虽然这里可能有多个问题,但delete函数末尾的
free(temp)
是错误的。您重新分配了该变量,但现在db和temp指向您随后释放的同一内存
如果free()实现占用内存(这通常不适用于大多数标准malloc/free实现),这可能会导致您的问题。如果没有,那么也有其他问题。我希望temp不再指向新分配的内存。因为就像你说的,我只需要db指向新的内存。但我该怎么办呢it@amitakCs:
temp=NULL代码>。如果回答了您的具体问题,请接受答案。第二个问题已解决。但是第一个问题呢?@amitakCs:嗯,需要更多的信息。在坏自由被移除后,它还会发生吗?要删除的项之前或之后的结构是否已被核化?是指针(db数组)被屏蔽还是结构(*db)被屏蔽?每次都这样吗?哦,我想在第二个memcpy的第三个参数上有一个操作顺序问题——应该是size-(I+1)
。(顺便说一句,您不需要将temp设置为NULL,它是一个自动变量,您将立即返回,因此temp变量将被销毁)。只是不抄袭。执行删除操作后,数据也会丢失。我指的是所有结构的内容。工作正常的是,我找到了要删除的正确对象(struct)。但复制过程是错误的。我的想法是复制要删除的对象之前的所有元素,并将它们放入另一个数组中。对于要删除的对象之后的元素,情况也是如此。因此,在最后我得到一个动态数组,其中包含除要删除的元素之外的所有元素。是的,它已被更新