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