Есть вопросы, подобные этому, но они недостаточно похожи на мой конкретный вопрос, на который я могу ответить.
Мой вопрос о том, как сделать глубокую копию структуры с указателями в качестве членов и как сделать 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;
}
Для глубоких копий структур с указателями-членами я знаю, что мы должны сделать НАШУ функцию копирования, которая делает что-нибудь разумное с указателями. Что это за разумная вещь ... Я не уверен ... так вот моя попытка этой ГЛУБОКОЙ копии.
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;
}
Другая часть моего вопроса (структура БЕЗ указателей как членов), вероятно, может быть просто объяснена устно.
ИЗДАНО ПОСЛЕ ЧТЕНИЯ ПОЛЕЗНЫХ КОММЕНТАРИЙ:
Мелкая копия:
тетср (s2, s1, SizeOf (Student));
Глубокая копия:
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);
}