#include<stdio.h>
#include<string.h>
#include<stdlib.h>

struct employee{
    int entry_year;
    char residence[6];
    char* name
};

int main(){
    struct employee a = {2019, "Seoul", NULL};
    struct employee b;

    a.name = (char *)malloc(6 * sizeof(char));
    strcpy(a.name, "Lee");

    b = a;
    b.name = (char *)malloc(6 * sizeof(char)); // deep copy
    strcpy(b.name, "Park");

    printf("%d %s %s\n", a.entry_year, a.residence, a.name);
    printf("%d %s %s\n", b.entry_year, b.residence, b.name);

    return 0;

}

구조체는 통째로 복사, 대입이 가능하다. 이게 무슨 말이냐면.. 위와 같이 구조체를 선언하고 대입연산을 해본다.

 

a 구조체는 선언과 동시에 초기화하고 b는 선언만 한다. b에 a를 대입하고 b를 수정하면 출력 결과는 다음과 같이 나온다.

 

2019 Seoul Park
2019 Seoul Park

 

b의 멤버변수 name을 수정했을 뿐인데, a의 멤버변수 name의 값까지 바뀌어버렸다. 이렇게 멤버변수가 포인터일 때, 포인터 값만 복사하면 두 포인터가 가리키는 메모리가 공유된다. 단순히 포인터 값만 복사하는 방법을 얕은 복사(Shallow copy)라 부른다.

 

하지만 b에 a를 복사한 후 멤버변수 name에 메모리할당하게 되면 데이터가 오염되지 않고 분리되어 사용이 가능하다. a.name과 b.name이 서로 다른 메모리를 가리키고 있기 때문에 b의 값을 바꾸더라도 a의 값이 바뀌지 않는다. 이를 깊은 복사(deep copy) 라 부른다.

'C' 카테고리의 다른 글

매개변수에 전역변수  (0) 2022.05.13
LinkedList  (0) 2022.05.10
main(int argc, char** argv)  (0) 2022.04.26
(unsigned int)1 - (unsigned int)2 > 0 ? yes : no  (1) 2022.04.23
문자열  (1) 2022.04.21

+ Recent posts