Делая глубокую копию структуры...делая мелкую копию структуры

Есть вопросы, которые мне нравятся, но они недостаточно похожи на мой конкретный вопрос, чтобы ответить на него.

Мой вопрос касается того, как сделать глубокую копию структуры с указателями в качестве членов и как сделать 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);
}
14
задан Community 23 June 2018 в 01:54
поделиться