28. wchar_t와 ROM

P4·2023년 6월 15일
0
post-thumbnail

wchar (문자 하나를 2바이트로), char는 1바이트

#include <stdio.h>

int main(void)
{
	{
		char c = 'a';
		wchar_t wc = L'a'; // 문자 하나를 2바이트로 쓰겠다는 뜻으로 L을 앞에붙임

        char szChar[10] = "abcdef";
		wchar_t szWChar[10] = L"abcdef";
        // 위 배열의 크기는 20바이트, 넣은건 14바이트 (마지막은 null문자)
        short arrShort[10] = { 97, 89, 99, 100, 101, 102 };

        ////////////////////////////////////////////////////////

		const wchar_t* pChar = L"abcdef"; // 이것도 됨 (왜?)
	}


	return 0;
}
  • 앞에 L이 붙으면 저 글자 하나하나가 다 2바이트가 됨

  • short 배열과 wchar 배열의 메모리 주소에 담긴 값은 똑같음, 다만 short에 문자열을 넣을 수는 없음

  • 문자열을 포인터 변수로 받을 수 있는 이유는? --> 문자열이 주소값을 반환하기 때문

  • 다만 포인터 변수와 크기를 맞춰줘야 함
    const char* szChar = L"abcdef"; 이나 const wchar_t* pChar = "abcdef";은 못받음 (단위가 안맞음)


ROM

#include <stdio.h>

int main(void)
{
	{
		char c = 'a';
		wchar_t wc = L'a';

		char szChar[10] = "abcdef";
		wchar_t szWChar[10] = L"abcdef";
		short arrShort[10] = { 97, 89, 99, 100, 101, 102 };

		////////////////////////////////////////////////////////

		const wchar_t* pChar = L"abcdef";
		
		szWChar[1] = 'z';
		// pChar[1] = 'z';
		// *(pChar + 1) = 'z';와 같음
	}


	return 0;
}
  • szWChar[1]은 변경할 수 있지만, pChar[1]은 변경할 수 없음

  • szWChar[1]l-value, pChar[1]r-value <-- why?

  • szWChar은 10개의 영역을 선언하고 그곳에 문자열 값을 복사해오는 것이지만

  • pChar은 메모리 영역 어딘가에 선언된 문자열 자체의 주소를 가리키는 것이기 때문에 그런거임

  • szWChar[1] 값을 바꾸는건 복사된 값을 바꾸는 것이지만

  • pChar[1]의 값을 바꾸는건 코드 실행도중에 코드 자체를 바꿔버리는 행위이기 때문에 ROM가 보호함 <-- 실행 도중에 자기 코드를 막 바꿔버린다는 의미라 막힌거임

    • const 포인터로 받아서 못바꾸는거라 생각할 수 있는데 애초에 문자열의 반환타입이 const 포인터임

    • 물론 wchar_t* pChar = (wchar_t*)L"abcdef"; 이렇게 억지로 캐스팅해서 받아올수도 있긴함, 이러면 수정도 됨

  • 다만 읽는건 가능 --> pChar[0];이건 아무 문제가 없음

profile
지식을 담습니다.

0개의 댓글