在我得到高度的低估之前,我會提到像我已經看到的這個問題,但它們都不夠相似對我而言,我至少有一個問題需要考慮(原諒我在這種情況下的無知),或者他們不一定是針對C語言的。C:製作一個結構體的深層副本...製作一個結構體的淺拷貝
我的問題是關於如何使用指針作爲成員來創建結構的深層副本,以及如何使用指針成員來創建結構的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;
}
我的問題的其他部分(結構沒有指針作爲成員)可能只是口頭解釋。
好的,EDITED之後讀有益的意見:
淺副本: 的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,然後將內容複製到它。不是一個好主意。 –
正式注意。謝謝! – Phil