문자열 리터럴이란 무엇일까?
다음은 문자열 리터럴을 설명해주는 좋은 예시이다.
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 |