작성
·
388
1
안녕하세요.
const char* str = “Constant string”; // str is a modifiable lvalue.
str = “Second string”; // “Constant string” = “Second String” // imposible
str[0] = ‘A’; //Error
char str2[] = “String in an array”;
str2[0] = ‘A’; // OK
문자열 포인터 개념이 좀 어렵게 느껴지네요.
str[0] = ‘A’; 은 왜 안되는 건가요? 만약 포인터를 이용해서 0번째 배열에 원소를 저장하고 싶으면 어떻게 해야 하나요?
답변 1
4
안녕하세요, 답변 도우미 Soobak 입니다.
const char* str = "Constant string";
에서, 문자열 "Constant string"
은 메모리의 읽기 전용 메모리라는 곳에 저장됩니다. 이 곳은 컴파일 시점에 정적 으로 할당되며, 실행 시간 동안에는 변경할 수 없습니다.
따라서, str[0] = 'A'
와 같이 문자열의 내용을 바꾸려고하면 오류가 발생합니다.
char str2[] = "String in an array"
의 경우, 문자열 "String in an array"
은 스택 이라고 불리는 메모리에 저장되고, 실행 시간 동안 변경될 수 있습니다.
따라서, str2[0] = 'A'
와 같이 문자열의 내용을 바꿀 수 있습니다.
만약, 질문자님이 의도하시는 것 처럼, 포인터를 이용해서 0
번째 배열에 원소를 변경하시려면, 포인터에 메모리를 동적으로 할당해주어, 힙 이라는 실행 시간 동안에도 수정 가능한 메모리 공간을 활용해야 합니다.
지금은 위와 같은 내용만 이해하시고 학습을 이어나가시길 추천드립니다.
같은 섹션의 이어지는 강의들인 강의 12.13 메모리 동적 할당 과 강의 12.17 동적 할당 메모리와 저장 공간 분류 를 학습하시고 나면 궁금하신 부분들에 대하여 완전히 이해가 가능하실 것 같습니다.
안녕하세요, 답변 도우미 Soobak 입니다.
차이를 이해하기 위해서는 C
언어에서 문자열이 어떻게 저장되고 관리되는지 알아야 합니다.
const char* str
로 선언된 문자열은 리터럴 문자열이며, 이는 컴파일 시점에 '읽기 전용 메모리' 영역에 저장됩니다.
이러한 문자열의 개별 문자를 변경하는 것은 '읽기 전용 메모리' 에 대한 수정을 시도하는 것이므로 허용되지 않습니다.
반면, str = "Second string"
은 str
포인터가 가리키는 주소를 변경하는 것입니다.
여기서, str
은 새로운 리터럴 문자열인 "Second string"
이 저장된 메모리 위치를 가리키게 됩니다.
이는 '읽기 전용 메모리' 영역의 내용 자체를 변경하는 것이 아니라, 단지 포인터 변수가 가리키는 주소를 변경하는 것이므로 허용됩니다.
말씀해주신 것처럼, 강의 12.13 과 12.17 을 수강하시면 보다 더 잘 이해가 되실 것 같습니다.
Soobak님 안녕하세요.
질문에 대한 답변 잘 봤습니다.
그런데 str[0] = 'A'가 안 된다면 str = "Second string"은 왜 되는 건가요? const char* str 을 통해서 읽기 전용 메모리에 저장되었다는 것은 동일하지 않습니까?
이 질문에 대한 답 역시 12.13과 12.17 강의를 보면 얻을 수 있을까요?