PGR21.com
- PGR21 관련된 질문 및 건의는 [건의 게시판]을 이용바랍니다.
- (2013년 3월 이전) 오래된 질문글은 [이전 질문 게시판]에 있습니다.
통합 규정을 준수해 주십시오. (2015.12.25.)
Date 2017/10/10 01:22:12
Name Helix Fossil
Subject [질문] 포인터인 구조체의 멤버를 깊은복사하려면 어떻게 해야하나요?
정수형의 변수에 멤버를 바로 대입해버리니까 자꾸 할당이 안돼는데
어떻게 해야하는지 감이 안오네요.

struct _st
{
     int x;
}

Func(struct _st *a)
{
      int a = a->x
}

대충 요런모양새입니다....

통합규정 1.3 이용안내 인용

"Pgr은 '명문화된 삭제규정'이 반드시 필요하지 않은 분을 환영합니다.
법 없이도 사는 사람, 남에게 상처를 주지 않으면서 같이 이야기 나눌 수 있는 분이면 좋겠습니다."
it's the kick
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의 값은 바뀌지 않을텐데요
Helix Fossil
17/10/10 01:37
수정 아이콘
Func에 동적할당된 구조체를 넣어서 그런걸로 추정하고 있습니다;;;
17/10/10 01:33
수정 아이콘
(수정됨) 깊은 복사라는건 새로 생긴 구조체 내부의 모든 변수를 다 넣어주는거니깐
새로 구조체를 하나 만들어서 그걸 함수의 결과로 return 해주면 될것 같습니다.

Func(struct _st *a){
_st *tmp;
tmp->x=a->x;
return *tmp;
}
Helix Fossil
17/10/10 01:43
수정 아이콘
이 변수를 또 연산하는데 써야돼서요;;;
Cazellnu
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;
}
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
110114 [질문] Visual Studio 2017 설치 관련 질문하는데요 [2] 히페리온1909 17/10/10 1909
110113 [질문] 결혼시 거주지 고민(수원 세종시) [25] 제니4512 17/10/10 4512
110112 [질문] 티비 구매 때문에 머리가 아프네요.. [12] 도널드 트럼프2068 17/10/10 2068
110110 [질문] 포인터인 구조체의 멤버를 깊은복사하려면 어떻게 해야하나요? [8] Helix Fossil3692 17/10/10 3692
110108 [질문] 이 면도기 모델 알수있을까요? [4] 푸끆이1743 17/10/10 1743
110107 [질문] 유튜브 시청시 가로줄이 생깁니다. [2] 이은영3985 17/10/10 3985
110105 [질문] 입헌 군주정 통일은 어떨까요? [112] nuki129002 17/10/09 9002
110104 [질문] 닉넴 변경기간 언제까지 인가요? [3] 김태동1425 17/10/10 1425
110103 [질문] 트위치 끊김에 대해서 [4] 삭제됨3416 17/10/10 3416
110102 [질문] 스파브랜드에서 코트 사는거 비추인가요? [30] 포이리에8681 17/10/10 8681
110101 [질문] [가상화폐] 비트코인 고점은..?? [4] 낙원2724 17/10/10 2724
110100 [질문] 인생 목적이 사라졌습니다. 막막하네요. 조언부탁드립니다. [18] 몰락인생4767 17/10/09 4767
110099 [질문] [하스스톤]어쩌다보니 시작해서 기초적인 질문좀 부탁드립니당. [17] 유니브로2278 17/10/09 2278
110098 [질문] 19금) 여자친구한테 같이 있자고 얘기를 따로 하시나요? [29] 치킨이 먹고 싶다11351 17/10/09 11351
110097 [질문] 예비군 가는데, 구형 폰에 지금 폰 usim 넣어도 되나요? [5] 개미핥기1950 17/10/09 1950
110096 [질문] [PC] 배그용 피씨 업글(VGA) 듀얼 모니터 등 [3] 유포늄2598 17/10/09 2598
110095 [질문] 갤럭시 7 엣지 시스템 [4] 엉망저그2088 17/10/09 2088
110094 [질문] 뻘질문) (소녀전선 계층) 한글날 닉네임 변경? [10] 라플비1939 17/10/09 1939
110093 [질문] 핸드폰 구입 질문입니다!! 요금제관련! [2] 하늘이어두워1969 17/10/09 1969
110092 [질문] [LOL] 정글챔 질문 있습니다. [7] 덩크매니아1955 17/10/09 1955
110091 [질문] 맥북프로레티나 2015 버전 13액정이 깨졌어요 종종종그그미1374 17/10/09 1374
110090 [질문] 키 작은 남자분들은 신발 어떤거 신으시나요? [20] McMurdo Station8775 17/10/09 8775
110088 [질문] 이런 디자인의 니트티를 찾아요. [2] 화잇밀크러버2150 17/10/09 2150
목록 이전 다음
댓글

+ : 최근 1시간내에 달린 댓글
+ : 최근 2시간내에 달린 댓글
맨 위로