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;
}
목록 삭게로! 맨위로
번호 제목 이름 날짜 조회
110136 [질문] [KBO] 피지알러분중에 응원팀을 바꾸신 분이 있나요? [19] 톰가죽침대1954 17/10/10 1954
110135 [질문] 서울에서 무슬림 친구 식사 대접 어디서 하나요? [8] 쿠크하하2229 17/10/10 2229
110134 [질문] GTA5 엔딩후 플레이 [6] 교자만두14554 17/10/10 14554
110133 [질문] elo를 계산하는 프로그램이 있을까요? 마둘리1717 17/10/10 1717
110132 [질문] 정확히 편곡이 뭔가요? [2] 비타에듀2115 17/10/10 2115
110131 [질문] 구두는 어떻게 관리해야하나요? [4] 소디1928 17/10/10 1928
110130 [질문] 플스가 켜지질 않습니다. [5] DenebKaitos1695 17/10/10 1695
110129 [질문] 중국 역사 잘아시는 분들께 여쭤봅니다. [7] 폰독수리2255 17/10/10 2255
110128 [질문] 일본에도 스크린야구장이 많이 있나요? [6] 잉여3258 17/10/10 3258
110127 [질문] 미국에서 우버로 장거리 이동도 가능할까요? [2] GogoGo3912 17/10/10 3912
110126 [질문] 100만원으로 피로함, 체력보충을 2일만에 할 수 있는 방법 찾습니다 [25] Secundo4065 17/10/10 4065
110125 [질문] 집에서 식수 어떻게 드시나요?? [14] 리니시아2480 17/10/10 2480
110124 [질문] 공공기관 면접관련 질문드립니다. [1] 샤르트르2556 17/10/10 2556
110123 [질문] 톰켓 설정질문입니다 Patrick Jane1322 17/10/10 1322
110122 [질문] [삭제예정] 사이버명예훼손 & 모욕 진행 상황 [4] 율곡이이3983 17/10/10 3983
110121 [질문] 건강하게 잘 자라고, 수명이 긴 고양이 종은 뭐가 있을까요? [16] TheLasid3640 17/10/10 3640
110120 [질문] 30대 여자 롱 패딩 추천 부탁드립니다.! [11] 솔지은4292 17/10/10 4292
110119 [질문] 핸드폰 번이 질문 [4] 토폴로지1251 17/10/10 1251
110118 [질문] 청바지 입으면 너무 튀어나오는데 해결 방법이 없을까요... [16] lotto tester18055 17/10/10 18055
110117 [질문] 캐주얼한 느낌의 로퍼? 구두? 를 구매하고 싶습니다. [8] Bluelight2125 17/10/10 2125
110116 [질문] 혹 Github 공개 / 비공개 설정에 대해 알 수 있을까요? [6] MaruNT6214 17/10/10 6214
110115 [질문] 중요한 일에 긴장하지 않는 방법이 있을까요? [5] 빅게임피쳐1719 17/10/10 1719
110114 [질문] Visual Studio 2017 설치 관련 질문하는데요 [2] 히페리온1913 17/10/10 1913
목록 이전 다음
댓글

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