Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C 언어 문자열 리터럴이란? 개념부터 활용법까지 총정리


문자열 리터럴(string literal)은 널 문자('\0')로 끝나는 문자들의 연속입니다. 큰따옴표로 감싸서 표현하며, 대표적인 예는 다음과 같습니다.

char * str = "hi, hello"; /* 문자열 리터럴 */

배열 초기화에 활용하기

문자열 리터럴은 문자 배열을 초기화하는 데 자주 사용됩니다. 배열 크기에 따라 널 종단 문자의 포함 여부가 달라지므로 주의가 필요합니다.

char a1[] = "xyz"; /* a1은 {'x','y','z','\0'}을 저장하는 char[4] */
char a2[4] = "xyz"; /* a1과 동일한 결과 */
char a3[3] = "xyz"; /* a3는 {'x','y','z'}만 저장하는 char[3], '\0'이 누락됨 */

위 예제에서 a3처럼 배열 크기를 문자 수와 같게 지정하면 널 종단 문자가 저장되지 않아, 이후 문자열 함수 사용 시 문제가 발생할 수 있습니다.

문자열 리터럴은 수정할 수 없다

문자열 리터럴은 읽기 전용 메모리에 저장되므로 수정이 허용되지 않습니다. 값을 변경하려고 시도하면 정의되지 않은 동작(undefined behavior)이 발생합니다.

char* s = "welcome";
s[0] = 'W'; /* 정의되지 않은 동작 발생! */

const 키워드로 안전하게 선언하기

이러한 실수를 방지하려면 포인터 선언 시 반드시 const를 붙여 해당 변수가 문자열 리터럴을 가리킨다는 사실을 명확히 해야 합니다. 이렇게 하면 잘못된 수정 시도를 컴파일 단계에서 잡아낼 수 있습니다.

char const* s1 = "welcome";
s1[0] = 'W'; /* 컴파일 오류 발생! */

다양한 문자 집합 지원

문자열 리터럴(문자 상수라고도 부름)은 접두사를 통해 서로 다른 문자 집합과 인코딩을 지원합니다. C11 표준에서 제공되는 주요 형태는 다음과 같습니다.

/* 일반 문자열 리터럴, char[] 타입 */
char* s1 = "abc";

/* UTF-8 문자열 리터럴, char[] 타입 */
char* s3 = u8"abc";

/* 16비트 와이드 문자열 리터럴, char16_t[] 타입 */
char16_t* s4 = u"abc";

/* 32비트 와이드 문자열 리터럴, char32_t[] 타입 */
char32_t* s5 = U"abc";

정리

문자열 리터럴은 널 문자로 끝나는 읽기 전용 문자열이며, 배열 초기화에 유용하지만 직접 수정하면 안 됩니다. const 포인터로 선언하여 안전성을 확보하고, 필요에 따라 u8, u, U 접두사를 활용해 원하는 인코딩의 문자열을 표현하면 됩니다.