관리 메뉴

History

[c언어]구조체 내부의 특정 변수만 복사하기 본문

C,C++/개념 실습 프로그래밍

[c언어]구조체 내부의 특정 변수만 복사하기

luckybee 2022. 9. 25. 19:20
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
반응형
Comments