크게 downvoted되기 전에 이미 본 적이있는 것과 비슷한 질문이 있지만 모두 유사하지는 않습니다. 적어도 내 생각에 그 질문에 대한 나의 무지를 변명해라. 그렇지 않으면 그것들은 꼭 C- 특정 적이 아니다.C : 구조체의 복사본 만들기 ... 구조체의 얕은 복사본 만들기
내 질문은 멤버로 포인터를 사용하여 구조체의 전체 복사본을 만드는 방법과 포인터 인 멤버가있는 구조체의 SHALLOW 복사본을 만드는 방법에 관한 것입니다. 그리고 나서, 참조 용으로, 포인터 멤버가없는 구조체의 완전한 복사본을 만드는 방법과 포인터 멤버가없는 구조체의 얕은 복사본을 만드는 방법을 설명합니다. 이제
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;
}
: 여기
typedef struct Student
{
char* first_name;
char* last_name;
int grade;
long id;
} Student;
내가 (헤더가 나와 함께 곰하시기 바랍니다 서식을 어렵게되고 있습니다) 학생을 만들려고 일반적인 기능입니다 :
의 우리가이 있다고 가정 해 봅시다 나는 깊고 얕은 사본을 만들려고 노력할 것이다. 나는 우리가 포인터와 재치있는 무언가를 우리 자신의 복사 기능을해야합니다 알고 포인터 회원들과 구조체의 전체 복사본을 위해 지금
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 (학생));
깊은 복사 :
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