본문 바로가기
Study/C++

[C++] 문자열 리터럴

by 스테디코디스트 2023. 7. 19.
반응형
#include <iostream>
using namespace std;

int main()
{
	char str[] = "hello"; // 1번
	const char *pstr = "eee"; // 2번		
	// char *pstr = "eee"; -> 안됨

	str[3] = 'k';
	// pstr[3] = 'k'; -> 안됨

	cout << str; // 결과 : helko
}

위의 1번과 2번의 차이점은 무엇일까?

 

먼저 1번은 "hello"라는 문자열을 복사하여 집어넣은 str이라는 배열(포인터)을 선언한 것이다.

이러한 str 배열의 값들은 Stack 영역에 순차적으로 저장되고, 수정이 가능하므로 각각의 인덱스에 접근하여 해당 문자들을 바꿀 수 있다.

 

다음으로 2번은 "eee"라는 문자열 리터럴이 저장된 곳을 가리키는 포인터 변수 *pstr을 선언한 것이다.

이때, 문자열 리터럴 "eee"는 값이 변경될 수 없는 Rodata영역에 저장되기에 중간에 수정되는 일이 발생하여 컴파일 오류가 나지 않도록 아예 const를 붙여서 선언하도록 되어있다.

 

#include <iostream>
using namespace std;

int main()
{
	const char* pstr = "eee";

	printf("hi \n"); // 결과 : hi
	printf("pstr : %s \n", pstr); // 결과 : pstr : eee
	printf("%c", pstr[2]); // 결과 : e
}

다음으로 여기에서 문자열 리터럴은 무엇일까?

 

정답은 아래와 같다.

"eee"

"hi \n"

"pstr : %s \n"

"%c"

 

위의 네가지의 값들은 읽기 전용 메모리 공간 Rodata에 저장된다.

또한, 말 그대로 읽기 전용이므로 *pstr은 위처럼 사용이 가능하다.