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 Jmnote 1.229.162.20
로그인하시면 댓글을 쓸 수 있습니다.
- 분류 댓글:
- C (7)
C, C++ 주석 ― YkhwongC, C++ 주석 ― John JeongC, C++ 주석 ― JmnoteC, C++ 주석 ― John JeongC언어 연결리스트 구현 ― 돌멩이C언어 연결리스트 구현 ― John JeongC언어 연결리스트 구현 ― 돌멩이