:: 게시판
:: 이전 게시판
|
- PGR21 관련된 질문 및 건의는 [건의 게시판]을 이용바랍니다.
- (2013년 3월 이전) 오래된 질문글은 [이전 질문 게시판]에 있습니다. 통합 규정을 준수해 주십시오. (2015.12.25.)
통합규정 1.3 이용안내 인용"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
17/10/10 01:30
코드가 모호해서 코드를 약간 고칠게요
struct _st { int x; } Func(struct _st *b) /* 이 부분 고쳤어요*/ { int a = b->x; } 근데 int a에 b->x의 값을 대입하는게 왜 얕은 복사인지 모르겠는데요? int a는 포인터가 아니라서 저렇게 하면 값이 들어가기때문에 나중에 b->x를 바꿔도 Func안에 a의 값은 바뀌지 않을텐데요
17/10/10 01:33
(수정됨) 깊은 복사라는건 새로 생긴 구조체 내부의 모든 변수를 다 넣어주는거니깐
새로 구조체를 하나 만들어서 그걸 함수의 결과로 return 해주면 될것 같습니다. Func(struct _st *a){ _st *tmp; tmp->x=a->x; return *tmp; }
17/10/10 03:20
그럴거면 왜 다른 이름으로 같은포인팅을 하시려고 하는지 쉽게말해 같은 어드레스를 든 변수를 두개 쓸 이유는 없잖아요 동일한 레퍼런스로 처리되길 원한다면.
일단 깊은 복사라는 용어가 생소한데 의도가 정확히 파악이 안됩니다
17/10/10 03:33
(수정됨) 구조체의 멤버 변수가 포인터가 아닌 이상 Deep Copy 개념을 생각할 필요가 없는데...
써 주신 코드는 그냥 멤버 변수 참조해서 다른 변수에 대입하는 상황이구요. 무슨 의도신지 감이 잘 안 오네요; 깊은 복사라는게 대입 연산자 하나로 끝날 동작이 아니고... - 복사본인 구조체 변수의 포인터 멤버 변수 각각에 대해서, - 원본 구조체 변수의 포인터 멤버 변수들이 각각 가리키는 데이터의 크기만큼 복사본의 포인터 멤버 변수에 메모리 할당을 하고, - 원본 구조체의 포인터 멤버 변수가 가리키는 데이터를 복사본의 포인터 멤버 변수가 가리키는 메모리 공간에 복사하는 과정입니다. 얕은 복사는 이런 과정 다 안 거치고 포인터 변수의 값을 그대로 복사하는 거구요.
17/10/10 09:55
하려는게 이런거 아닌가요?
문법적으로 맞지는 않을거 같지만.. struct _st { int x; } Func(struct _st *st) { int *a = &(st->x); } 근데 보통은 그냥 Func(struct_st *st) { struct_st *a = st; a->x; } 이런 식으로 쓰지 않나요?
17/10/10 10:18
(수정됨) 구조체의 멤버 변수인 포인터가 가리키는 메모리까지 직접 복사해주시면 됩니다.
(예제를 만들어봤습니다. 정신이 말짱하지 않아서 미흡할 수 있습니다.) #include <stdio.h> // puts() #include <stdlib.h> // exit(), free(), malloc(), EXIT_FAILURE #include <string.h> // strcpy() typedef struct Name { char first_name[30]; char last_name[30]; } *Name; typedef struct Person { Name name; } *Person; void *my_malloc (size_t size) { void *pointer = malloc(size); if (pointer == NULL) { puts("메모리 할당 실패"); exit(EXIT_FAILURE); } return pointer; } void make_deep_copy_of_person (Person person) { Person person2 = my_malloc(sizeof(struct Person)); person2->name = my_malloc(sizeof(struct Name)); memcpy(person2->name, person->name, sizeof(struct Name)); strcpy(person->name->first_name, "길동"); strcpy(person->name->last_name, "홍"); puts(person2->name->first_name); // 출력 : 성수 puts(person2->name->last_name); // 출력 : 김 free(person2->name); free(person2); person2 = NULL; } int main (void) { Person person = my_malloc(sizeof(struct Person)); person->name = my_malloc(sizeof(struct Name)); strcpy(person->name->first_name, "성수"); strcpy(person->name->last_name, "김"); make_deep_copy_of_person(person); free(person->name); free(person); person = NULL; return 0; }
|