회신: UNIT 42.2 문자열 붙이기 질문
, 도장_ 관리자님이 작성C 언어에서는 지원하지 않기 때문입니다.
char *s1 = "world";
"world"는 문자열 리터럴이고, 읽기 전용입니다. 리터럴은 변경될 수 없습니다.
s1은 문자열 리터럴을 가리키는 포인터입니다.
따라서 "world"라는 문자열 리터럴은 변경될 수 없습니다.
s1은 문자열 리터럴을 가리키는 포인터이므로 포인터 자체는 바뀔 수 있습니다.
#include <stdio.h>
int main()
{
char *s1 = "Hello";
char *s2 = "World";
s1 = s2;
printf("%s\n", s1);
return 0;
}
결과를 보면 s1은 "World"를 출력하게 됩니다. 단, 다시는 "Hello" 문자열 리터럴을 가리키지는 못하게 됩니다.(일종의 메모리 누수)
s1과 s2는 포인터이므로 포인터는 바뀔 수 있으나 "리터럴 자체를 바꾼 것이 아닙니다". 리터럴을 변경하려하면 에러가 발생합니다. 가령, s1[0] = 'W'; 같은 코드는 오류가 발생합니다.
본문의 예제를 보면 strcat(s2, s1)은 왜 오류가 발생하는가?
#define _CRT_SECURE_NO_WARNINGS // strcat 보안 경고로 인한 컴파일 에러 방지
#include <stdio.h>
#include <string.h> // strcat 함수가 선언된 헤더 파일
int main()
{
char *s1 = "world"; // 문자열 포인터
char *s2 = "Hello"; // 문자열 포인터
strcat(s2, s1); // 실행 에러
printf("%s\n", s1);
return 0;
}
포인터가 가리키는 리터럴을 변경하려고 했기 때문입니다. 리터럴은 변경 불가입니다.
이 문제를 해결하려면 변경이 가능한 메모리를 할당하는 것입니다.
int main()
{
char *s1 = "world"; // 문자열 포인터
char *s2 = malloc(sizeof(char) * 20); // char 20개 크기만큼 동적 메모리 할당
strcpy(s2, "Hello"); // s2에 Hello 문자열 복사
strcat(s2, s1); // s2 뒤에 s1을 붙임
printf("%s\n", s2); // Helloworld
free(s2); // 동적 메모리 해제
return 0;
}
s2는 동적으로 할당된 읽기/쓰기가 가능한 공간입니다. s2만 변경하므로 문제가 발생하지 않습니다. 만약 s1이 가리키는 리터럴을 변경하려 하면 오류가 발생합니다.