高度に下降した状態になる前に、私がすでに見たような質問がありますが、私の具体的な質問には、少なくとも、(その場合は私の無知を言い訳)、またはそれらは必ずしも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を解放してからコンテンツをコピーします。いい考えではない。 –
Dulyが指摘した。ありがとう! – Phil