C언어 구조체 복사

1 개요[ | ]

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

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

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

  • 포인터가 없는 경우 사용
C
CPU
0.1s
MEM
17M
0.1s
Copy
#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
}
10, 2
1, 2

2.2 memcpy() 사용[ | ]

  • memcpy() 함수를 사용해 메모리 복사를 수행함
C
Copy
#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
}
Loading

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

  • 얕은 복사로 포인터를 복사할 경우 복사 받은 포인터에서 복사한 포인터와 동일한 주소값을 가지기 때문에 동일한 메모리를 가리키는 문제가 있어 깊은 복사를 해주어야 한다.
C
Copy
#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의 구조체 이름도 함께 바뀜
}
Loading

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

  • 깊은 복사와 얕은 복사의 가장 큰 차이점은 malloc()을 통해 복사될 구조체의 메모리를 별도 할당한다.
C
Copy
#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
}
Loading

4 같이 보기[ | ]

편집자 Jmnote bot J Jmnote 1.229.162.20
  • C, C++ 주석
    C에도 적용되는 주석 문법이라면, "C와 C++ 주석"으로 제목을 옮기면 어떨까요? Ykhwong
  • C, C++ 주석
    @Ykhwong 네네. 좋은 의견 입니다. 변경 부탁드려요. John Jeong
  • C, C++ 주석
    'C스타일 주석'이라는 제목도 괜찮겠네요.J Jmnote
  • C, C++ 주석
    'C, C++ 주석' 형태로 최종 가도록 하겠습니다. C와 C++ 까지의 현재 범위를 명확히 하려 합니다. John Jeong
  • C언어 연결리스트 구현
    마지막에 메모리 해지는 어떤식으로 해야되나요?? 돌멩이
  • C언어 연결리스트 구현
    @돌맹이 head 가 널까지 가는거 보시고 코드가 아름 답진 않지만 대략 아래 방법처럼 하나씩 삭제 하시면 될 것 같습니다. void deleteNode(nodeType *head) { nodeType *ptr = head, *ptr2 = NULL; while(ptr- John Jeong
  • C언어 연결리스트 구현
    답변 감사합니다! 돌멩이