더듬이의 헬로월드

Hello, World!

프로그래밍 언어/C++ [기본]

[C++기본] 20.문자열-1

더듬이 2021. 9. 23. 19:02
728x90

문자을 배열로 선언한다면?

⇒문자로 이루어진 배열 == 문자열

문자열의 초기화는 일반 배열과는 조금 다르다.

int arr[10]={1,2,3,4,5,6};

일반 배열은 이처럼 괄호 안에 넣어주었지만,

    char ch1 = 'a';
    wchar_t ch2 = L'b';

    char ch3[10] = "ABCDEFG";
    wchar_t ch4[10] = L"ABCDEFG";

문자열은 쌍따옴표 안에 적으면 된다!

char은 1바이트, wchar_t는 2바이트의 공간을 차지한다.

wchar_t를 이용하면 초기화시 L을 붙여야 한다.


어떻게 이게 가능할까?

다음과 같은 코드가 있다.

const wchar_t* pchar=L"abcdef";

주소값만 들어갈 수 있는 포인터 변수에 문자열이 들어갔다는 것은 어떤 의미를 가질까?

즉, 문자열은 주소값이다. 그래서 주소 변수로 받을 수 있는 것이다.


코드 영역와 문자열

    wchar_t pchar1[10] = L"ABCDEFG";
    const wchar_t* pchar2=L"ABCDEFG";

    pchar1[1]='z'; //성공
    pchar2[1]='z'; //오류

다시 돌아와서 이 코드를 보자.

우선, L"ABCDEFG" 는 배열의 첫 주소, 즉 'A'의 시작 주소를 반환해준다.

pchar1[1]='z'; 은 일반 배열과 마찬 가지로 정상적으로 ROM에 있는 코드가 스택 메모리에

복사 되어서 각 공간에 할당이 된다. 그리고 그 공간의 있는 값을 바꾸기 때문에 문제없이 실행이 되겠지만, pchar2[1]='z';의 경우에는 말이 달라진다.

일단 const wchar_t* pchar2=L"ABCDEFG";로 선언을 하는 순간, 포인터 pchar2는

값을 가져야 하는데, 복사받을 배열이 없으므로, 반환받을 L"ABCDEFG"의 주소값은 ROM, 코드영역에 있는 주소값을 가지게 된다.

근데 읽기 전용 메모리에 있는 값을 역참조로 바꾸는 것이 가능할까?

ROM에 있는 값은 수정이 불가능 하기 떄문에, 오류 방지를 위해서 역참조 수정 기능을 제한하여

const키워드로 상수화를 시켜주는 것이다.

그럼 const키워드를 뺴면 오류가 나겠네요?

wchar_t* pchar2 = L"ABCDEFG";

애초에 이런 형식의 구문은 선언조차 되지 않는다.

문자열의 주소 반환 타입은 const이기 때문.

강제 캐스팅을 하여 일부러 에러를 유발하는 것이 아니면, 자동으로 구문과 컴파일러가 막아준다.

ROM영역을 건드는 것은 매우 심각한 오류를 발생시킨다.

⇒프로그램 실행 중에 발생되기 때문

728x90

'프로그래밍 언어 > C++ [기본]' 카테고리의 다른 글

[C++기본] 22.문자열-3  (0) 2021.09.23
[C++기본] 21.문자열-2  (0) 2021.09.23
[C++기본] 19.문자  (0) 2021.09.17
[C++기본] 18.void 포인터  (0) 2021.09.02
[C++기본] 17.const와 포인터  (0) 2021.08.31