본문 바로가기

c,c++

#5 얕은 복사 깊은 복사, 타입 캐스팅

1. 얕은 복사와 깊은복사

- 구조체를 사용하다보면 다음과같은 코드 그리고 다음과 같은 복사를 사용 할 일이 있다.

 

struct Test
{
	int Num;
	char* Name;
};
int main()
{
	
	Test t1, t2;
	t1.Name = (char*)malloc(sizeof(char) * 30);
	strcpy(t1.Name, "Green Slime");
	t1.Num = 1;
	t2 = t1; //복사 shallow copy.
	strcpy(t2.Name, "red Slime");

	printf("t1.Name : %s, t1.Num : %d\n", t1.Name, t1.Num);
	printf("t2.Name : %s, t2.Num : %d\n", t2.Name, t2.Num);

	free(t1.Name);


	return 0;
}

- 이러한 코드를 쓸때 Name은 t1, t2 둘다 red slime 이 된다. 이 이유는 t2 = t1; 이 라인에서 t2 의 char 포인터는 green slime이 저장된 공간을 가져오고 그 공간을 red slime으로 바꿔주기 때문이다. 이처럼 포인터의 주소만 복사하는 것을 얕은 복사라고 한다.

- 이러한 일을 방지하기위해서, t2에다가 새로운 공간을 만들어서 데이터만 저장하는 것을 깊은 복사라고 하고, 다음과 같이 코드를 짜게 된다.

 

struct Test
{
	int Num;
	char* Name;
};
int main()
{
	
	Test t1, t2;
	t1.Name = (char*)malloc(sizeof(char) * 30);
	strcpy(t1.Name, "Green Slime");
	t1.Num = 1;
	t2 = t1; //복사 shallow copy.
	t2.Name = (char*)malloc(sizeof(char) * 30);
	strcpy(t2.Name, t1.Name);
	strcpy(t2.Name, "red Slime");

	printf("t1.Name : %s, t1.Num : %d\n", t1.Name, t1.Num);
	printf("t2.Name : %s, t2.Num : %d\n", t2.Name, t2.Num);

	free(t1.Name);
	free(t2.Name);

	return 0;
}

-이렇게 새로운 공간을 만들어 따로 저장하는 방식을 깊은 복사라고 한다.

https://bblackscene21.tistory.com/6

 

2. 타입 캐스팅.

- C언어는 기본적으로 자료형 변환을 자동으로 지원한다. 예를들어 3.25를 int형으로 저장시키면 3으로만 저장이 된다.

- 만약 자료형을 자기가 원하는 방식으로 형 변환을 하고싶으면 (변환시키고자 하는자료형)변수이름 이렇게 저장하면 된다.

3. 동적 할당.

- 일반적으로 변수, 배열들은 메모리의 스택이라는 공간에 저장이 된다. 그런데, 동적 할당을 하기 위해서는 heap이라는 메모리 공간에 저장을 해야하고, 이를 행할 수 있게 도와주는 함수는 malloc이다. (calloc같은 다른 함수들도 있던데, 잘 사용하지 않는듯?)

- 동적할당함수 malloc은 기본적으로 void 포인터 형 함수이다. 즉, return값이 존재하지않는 포인터 함수.

- 따라서 malloc은 앞에 형변환을 통해서 어떠한 데이터가 저장되어지는지 선언을 한다. 또한, free함수를 통해 메모리에서 제거를 해야한다.

'c,c++' 카테고리의 다른 글

const 키워드에 관해서  (0) 2022.10.24
#1~ #5에 대한 예제 코딩.  (0) 2022.01.25
#4 함수, 포인터, 함수포인터, 구조체포인터 전반  (0) 2022.01.19
#3 배열, 구조체, 연산자  (0) 2022.01.19
#2 반복문과 난수생성  (0) 2022.01.19