C언어 구조체 복사

1 개요[ | ]

C언어 구조체 복사
C Language Structure Copy
  • 구조체 복사 방법

2 얕은 복사 (Shallow Copy)[ | ]

2.1 연산자 (=) 사용[ | ]

  • 포인터가 없는 경우 사용
#include <stdio.h>

struct pos {
    int x;
    int y;
};

int main()
{
    struct pos a = {1, 2};
    struct pos b;

    b = a;

    a.x = 10;

    printf("%d, %d\n", a.x, a.y); // 10, 2
    printf("%d, %d\n", b.x, b.y); // 1, 2
}

2.2 memcpy() 사용[ | ]

  • memcpy() 함수를 사용해 메모리 복사를 수행함
#include <stdio.h>
#include <string.h>

struct pos {
    int x;
    int y;
};

int main()
{
    struct pos a = {1, 2};
    struct pos b;

    memcpy(&b, &a, sizeof(struct pos));

    printf("%d, %d\n", a.x, a.y); // 1, 2
    printf("%d, %d\n", b.x, b.y); // 1, 2
}

2.3 포인터 복사 (문제 발생)[ | ]

  • 얕은 복사로 포인터를 복사할 경우 복사 받은 포인터에서 복사한 포인터와 동일한 주소값을 가지기 때문에 동일한 메모리를 가리키는 문제가 있어 깊은 복사를 해주어야 한다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NAME 20

struct person {
    char *name;
    int age;
};

int main()
{
    struct person a;
    struct person b;

    // 구조체 a 초기화
    a.name = (char *)malloc(sizeof(NAME) + 1);
    strcpy(a.name, "john");
    a.age = 20;

    // 구조체 b로 얕은 복사 (포인터는 포인터의 주소만 복사 됨)
    b = a;

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

    // 구조체 a 이름 변경
    strcpy(a.name, "marry");
    a.age = 30;

    printf("%s, %d\n", a.name, a.age);
    printf("%s, %d\n", b.name, b.age); // 구조체 a의 이름을 바꿨으나 의도하지 않게 b의 구조체 이름도 함께 바뀜
}

3 깊은 복사 (Deep Copy)[ | ]

  • 깊은 복사와 얕은 복사의 가장 큰 차이점은 malloc()을 통해 복사될 구조체의 메모리를 별도 할당한다.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define NAME 20

struct person {
    char *name;
    int age;
};

int main()
{
    struct person a;
    struct person b;

    // 구조체 a 초기화
    a.name = (char *)malloc(sizeof(NAME) + 1);
    strcpy(a.name, "john");
    a.age = 20;

    // 구조체 a의 구조체 b로 깊은 복사
    b.name = (char *)malloc(sizeof(NAME) + 1);
    strcpy(b.name, a.name);
    b.age = a.age;

    // 복사된 내용 출력
    printf("%s, %d\n", a.name, a.age); // john, 20
    printf("%s, %d\n", b.name, b.age); // john, 20

    // 구조체 a 값 변경
    strcpy(a.name, "marry");
    a.age = 30;

    // 구조체 a 값 변경 후 구조체 b 의 값에는 영향을 미치지 않음을 알 수 있음
    printf("%s, %d\n", a.name, a.age); // marry, 30
    printf("%s, %d\n", b.name, b.age); // john, 20
}

4 같이 보기[ | ]

문서 댓글 ({{ doc_comments.length }})
{{ comment.name }} {{ comment.created | snstime }}