본문 바로가기
알고리즘/[EXP] 삼성 SW 역량 테스트 C형

타입 캐스팅으로 한 번에 메모리 쓰기, 읽기 (Memory Write and Read with Type Casting)

by 피로물든딸기 2023. 8. 15.
반응형

삼성 C형 전체 링크

 

참고

- 타입 캐스팅으로 deep copy, memcpy 구현하기

 

타입 캐스팅을 이용하면 char 배열 8칸을 한꺼번에 입력할 수 있다.

즉, 크기가 작은 타입의 배열을 long type으로 한 번에 읽거나 쓸 수 있다.

이 방법은 메모리를 통째로 복사하는 방법과 원리가 같다.


Write

 

char a[8]; 배열에 1, 2, 3, 4, 5, 6, 7, 8을 입력해야 한다고 하자.

그러면 for문을 8번 순회해서 i 번째 배열에 i + 1을 입력하는 코드를 만들 수 있다.

char a[8] = { 0 };
for (int i = 0; i < 8; i++) a[i] = i + 1;

 

하지만 type casting으로 a[0]번째 주소 (&a[0])을 long type으로 캐스팅하면, 한 번에 값을 입력할 수 있다. 

typedef long long int ll;

*(ll*)&a[0] = 0x0102030405060708;

 

위 방법은 실제로 0x[01][02]...[08] 순서대로 들어가지 않고, [08]이 먼저 a[0]에 들어간다.

따라서 아래와 같이 코드를 수정해야 a[i] = i + 1 과 같은 결과가 된다.

// *(ll*)&a[0] = 0x0102030405060708; // 거꾸로 들어감.
*(ll*)&a[0] = 0x0807060504030201;

 

전체 코드는 다음과 같다.

#include <stdio.h>

typedef long long int ll;

int main()
{
	char a[8] = { 0 };
	//for (int i = 0; i < 8; i++) a[i] = i + 1;

	// *(ll*)&a[0] = 0x0102030405060708; // 거꾸로 들어감.
	*(ll*)&a[0] = 0x0807060504030201;

	for (int i = 0; i < 8; i++) printf("%d ", a[i]);
	putchar('\n');

	return 0;
}


Read

 

위의 방법을 응용하여 한 번에 값을 비교하는 것도 가능하다.

char a[8]; 이 모두 같은 value인지 체크하는 함수는 다음과 같다.

bool checkAll(char* a, int value)
{
	for (int i = 0; i < 8; i++)
		if (a[i] != value) return false;
	return true;
}

 

아래의 함수를 실행하면 checkAll이 true가 된다.

#include <stdio.h>

bool checkAll(char* a, int value)
{
	for (int i = 0; i < 8; i++)
		if (a[i] != value) return false;
	return true;
}

int main()
{
	char a[8] = { 0 };

	for (int i = 0; i < 8; i++) a[i] = 1;

	int value = 1;

	if (checkAll(a, value)) printf("all a[i] is %d\n", value);
	else printf("a[i] is not value %d\n", value);

	return 0;
}

 

checkAll은 8개의 배열을 매번 비교하지만, 타입 캐스팅을 이용하면 한 번에 비교가 가능하다.

char 배열이 연속으로 1이 8개라는 것은 long type으로 메모리를 읽었을 때, 0x0101010101010101 이기 때문이다.

if ( *(ll*)&a[0] == 0x0101010101010101 ) ...

 

따라서 아래와 같이 코드를 간결히 수정할 수 있다.

#include <stdio.h>

typedef long long int ll;

int main()
{
	char a[8] = { 0 };

	for (int i = 0; i < 8; i++) a[i] = 1;
	// *(ll*)&a[0] = 0x0101010101010101;

	if (*(ll*)&a[0] == 0x0101010101010101) printf("all a[i] is %d\n", 1);
	else printf("a[i] is not value %d\n", 1);

	return 0;
}
반응형

댓글