인프런 커뮤니티 질문&답변

몽글구름님의 프로필 이미지

작성한 질문수

홍정모의 따라하며 배우는 C언어

12.2 객체와 식별자, lvalue와 rvalue

12.2 강의 질문있어요

23.07.13 09:54 작성

·

379

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님의 프로필 이미지

2023. 07. 13. 17:03

안녕하세요, 답변 도우미 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 동적 할당 메모리와 저장 공간 분류 를 학습하시고 나면 궁금하신 부분들에 대하여 완전히 이해가 가능하실 것 같습니다.

Byunghee Moon님의 프로필 이미지

2023. 12. 08. 01:23

Soobak님 안녕하세요.

질문에 대한 답변 잘 봤습니다.

그런데 str[0] = 'A'가 안 된다면 str = "Second string"은 왜 되는 건가요? const char* str 을 통해서 읽기 전용 메모리에 저장되었다는 것은 동일하지 않습니까?

이 질문에 대한 답 역시 12.13과 12.17 강의를 보면 얻을 수 있을까요?

Soobak님의 프로필 이미지

2023. 12. 09. 15:26

안녕하세요, 답변 도우미 Soobak 입니다.

 

차이를 이해하기 위해서는 C 언어에서 문자열이 어떻게 저장되고 관리되는지 알아야 합니다.

 

const char* str 로 선언된 문자열은 리터럴 문자열이며, 이는 컴파일 시점에 '읽기 전용 메모리' 영역에 저장됩니다.

이러한 문자열의 개별 문자를 변경하는 것은 '읽기 전용 메모리' 에 대한 수정을 시도하는 것이므로 허용되지 않습니다.

 

반면, str = "Second string"str 포인터가 가리키는 주소를 변경하는 것입니다.
여기서, str 은 새로운 리터럴 문자열인 "Second string" 이 저장된 메모리 위치를 가리키게 됩니다.
이는 '읽기 전용 메모리' 영역의 내용 자체를 변경하는 것이 아니라, 단지 포인터 변수가 가리키는 주소를 변경하는 것이므로 허용됩니다.

 

말씀해주신 것처럼, 강의 12.13 과 12.17 을 수강하시면 보다 더 잘 이해가 되실 것 같습니다.