Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 실습
- Tipsware
- 미가공
- 핵심 요약
- 도움말
- do it c
- ListBox
- MFC
- 정보처리기사
- 김성엽
- linux
- 충무창업큐브
- MFC 예제
- 정처기 독학
- 유료강좌
- mysql
- win32
- 별찍기 기초
- SSG
- C
- C++
- MyTread
- 마이크로소프트
- 별찍기
- mfc 실습
- 포트폴리오
- tips강좌
- C언어
- Time
- MyThread
Archives
- Today
- Total
History
[c언어]구조체 내부의 특정 변수만 복사하기 본문
728x90
반응형
#include<stdio.h>
#include<malloc.h>
#include<string.h>
struct Point2D
{
int x;
int y;
};
int main()
{
struct Point2D* p1 = (Point2D*)malloc(sizeof(struct Point2D));
struct Point2D* p2 = (Point2D*)malloc(sizeof(struct Point2D));
p1->x = 10;
p1->y = 20;
memcpy(p2, p1, sizeof(struct Point2D));
printf("p2->x= %d p2->y= %d\n", p2->x, p2->y);
free(p1);
free(p2);
return 0;
}
위 코드는 p1에 입력된 구조체 값을 통째로 p2에 복사한 후 p2를 출력하는 코드이다. 이러한 방법은 구조체 시작 주소에서 구조체 크기만큼 복사한 것이기 때문에 구조체가 통째로 복사된다.
그러나 구조체를 통째로 복사하는 것이 아니라 memcpy로 구조체 안에 있는 변수 1개만 바꿔야한다면 소스는 어떻게 바뀌어야 할까? 답은 아래와 같다.
#include<stdio.h>
#include<malloc.h>
#include<string.h>
struct Point2D
{
int x;
int y;
};
int main()
{
struct Point2D* p1 = (Point2D*)malloc(sizeof(struct Point2D));
struct Point2D* p2 = (Point2D*)malloc(sizeof(struct Point2D));
p1->x = 10;
p1->y = 20;
p2->x = 3;
p2->y = 4;
memcpy((int*)&p2->x, (int*)&p1->x, sizeof(int));
// memcpy는 인자를 void로 받아야하니까 형 변환을 해주고
// 주소값으로 받아야하기 때문에 &를 붙혀줍니다
printf("p1->x= %d p1->y= %d\n", p1->x, p1->y);
printf("p2->x= %d p2->y= %d\n", p2->x, p2->y);
free(p1);
free(p2);
}
위처럼 memcpy에 형변환을 걸어준 후 복사할 크기를 지정하면 된다.
형변환을 하는 이유는 아래처럼 memcpy의 매개변수 값이 void 포인터 형식으로 되어있기 때문에 각 구조체의 변수에 &를 붙이고 마지막에 형 변환을 진행해줘야 오류 없이 값이 잘 복사된다.
void *memcpy(void *_Dst, void const *_Src, size_t _Size);
728x90
반응형
'C,C++ > 개념 실습 프로그래밍' 카테고리의 다른 글
[c언어]중복없는 난수 생성하기 method_2 (0) | 2022.09.25 |
---|---|
[c언어]중복없는 난수 생성하기 method_1 (1) | 2022.09.25 |
[c언어]현재 시간을 출력하려면 어떻게 해야할까? (0) | 2022.09.21 |
문자열에 포함된 숫자를 문자로 변경하기 (0) | 2022.09.21 |
쉼표로 문자열을 구분해서 줄바꿈 출력하기 - 함수 직접 구현 (2) | 2022.09.21 |
Comments