【发布时间】:2011-08-02 11:59:29
【问题描述】:
有类似这个问题的问题,但它们与我的具体问题不够相似,无法继续。
我的问题是关于如何制作以指针为成员的结构的深层副本,以及如何制作以指针为成员的结构的 SHALLOW 副本。然后,仅供参考,如何制作没有指针成员的结构的深层副本以及如何制作没有指针成员的结构的浅层副本(不确定最后一个是否有意义)。
假设我们有这个:
typedef struct Student
{
char* first_name;
char* last_name;
int grade;
long id;
} Student;
这是我创建一个学生的通用函数(标题很难格式化):
Student* create_student(const char* first_name, const char* last_name, int grade,long id)
{
Student *newStudentp = (malloc(sizeof(Student)));
newStudentp -> last_name = (malloc((strlen(last_name) + 1) * sizeof(char)));
newStudentp -> first_name = (malloc((strlen(first_name) + 1) * sizeof(char)));
strncpy(newStudentp -> first_name, first_name, strlen(first_name) + 1);
strncpy(newStudentp -> last_name, last_name, strlen(last_name) + 1);
newStudentp -> grade = grade;
newStudentp -> id = id;
return newStudentp;
}
我尝试做一个深拷贝和一个浅拷贝;
int main()
{
Student *s1 = create_Student("Bo","Diddly", 100, 221);
Student *s2 = create_Student("Leeroy","Jenkins",50,1337);
memcpy(&s2,&s1,sizeof(Student)); //shallow copy of s1 INTO s2?
return 0;
}
对于带有指针成员的结构的深拷贝,我知道我们必须创建 OUR OWN 拷贝函数,该函数对指针执行一些明智的操作。什么是明智的……我不确定……所以这是我对这个 DEEP 副本的尝试。
void copy_Student(Student *s1, Student *s2)
{
s2 -> grade = s1 -> grade;
s2 -> id = s1 -> id;
s2 -> first_name = s1 -> *first_name;
s2 -> last_name = s1 -> *last_name;
}
我的问题的另一部分(没有指针作为成员的结构)可能只能口头解释。
阅读有用的评论后编辑:
浅拷贝: memcpy(s2,s1,sizeof(学生));
深拷贝:
void free_student(Student* stu)
{
free(stu -> first_name);
free(stu -> last_name);
}
void copy_Student(Student *s1, Student *s2)
{
s2 -> grade = s1 -> grade;
s2 -> id = s1 -> id;
s2 -> first_name = strdup(s1 -> first_name);
s2 -> last_name = strdup(s1 -> last_name);
}
【问题讨论】:
-
free_student 应该在你完成一个学生之后调用,并且不在 copy_Student 中。您首先释放 s2,然后将内容复制到其中。不是个好主意。