문자열 리터럴이란 무엇일까?

다음은 문자열 리터럴을 설명해주는 좋은 예시이다.

std::cout << "Hello World" << std::endl;

위 문장에서 "Hello World" 가 문자열 리터럴에 해당한다.

본 질문에 앞서 다음의 코드를 살펴보자.

#include <iostream>

using namespace std;

int main()
{
  char* ptr1 = "char array literal"; // C++14 or below 
  char* ptr2 = "char array literal";
  char* ptr3 = "char array literal";
  char* ptr4 = "char array literal";

  printf("%p %p %p %p", ptr1, ptr2, ptr3, ptr4);

  return 0;
}

위 코드의 실행결과는 다음과 같다. `0x4007e4 0x4007e4 0x4007e4 0x4007e4 ` 메모리 주소의 공간은 실행시 계속적으로 변할 수 있으니 단순히 동일한 값만을 출력한다는 것만 기억하자. 그렇다면 왜 동일한 문자열 리터럴은 동일한 주소값을 가질까?
문자열 리터럴은 **ROM**공간에 저장된다. 이러한 이유는 컴파일러가 메모리를 절약하기 위함이다. 이러한 목적에 따라 위 코드에서 `ptr1`, `ptr2`, `ptr3`, `ptr4`는 같은 주소공간을 가리키게 된 것이다. 이러한 방식을 리터럴 풀링(literal pooling)이라 부른다.

그렇다면 다음의 코드는 어떤 결과를 발생할까?

#include

using namespace std;

int main()  
{  
char\* ptr = "char array literal";  
ptr\[0\] = 'L';

cout << ptr << endl;

return 0;  
}

당연하게도 위 코드는 실행되지 않고 컴파일 에러를 발생시킨다. ptr은 ROM 공간에 저장되어 있는 문자열 리터럴이므로 문자열을 수정하거나 이어붙이거나 할 수 없다. 그렇다면 어떻게 해야 사용자가 수정할 수 있는 문자열 배열을 만들 수 있을까? 정답은 아래의 코드와 같다.

#include

using namespace std;

int main()  
{  
char\* ptr = "char array literal";

char arr\[\] = "char array";  
arr\[0\] = 'C';

cout << ptr << endl;  
cout << arr << endl;

return 0;  
}

위 코드에서 arr은 사용자가 초기화한 문자열의 크기만큼 자동으로 공간을 할당해 문자열을 담아준다.
이처럼 char* 과 char []의 미묘한 차이점을 잘 알고 실수하는 일이 없도록 해야할 것이다.

'개발언어 > C++' 카테고리의 다른 글

String class 멤버함수 c_str()에서의 주의점  (0) 2020.08.10
switch-case 문에서의 local variable 선언  (0) 2020.08.08
decltype(auto) vs auto  (0) 2020.08.04

+ Recent posts