Есть вопросы, которые мне нравятся, но они недостаточно похожи на мой конкретный вопрос, чтобы ответить на него.
Мой вопрос касается того, как сделать глубокую копию структуры с указателями в качестве членов и как сделать 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;
}
Для глубоких копий структур с указателями я знаю, что мы должны сделать НАШУ НАШУ функцию копирования, которая делает что-то разумное с указателями. Что это разумная вещь ... я не уверен ... так что вот моя попытка сделать эту копию 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(Student));
Deep copy:
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);
}