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

용개형멋져님의 프로필 이미지
용개형멋져

작성한 질문수

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

11.6 다양한 문자열 함수들

10분 15초경 질문

작성

·

318

2

dest = "Start something"; // Error

여기서 에러가 생기는 이유를 잘 모르겠어서 찾아보니 같은 질문이 있길래 답변을 봤습니다.

https://www.inflearn.com/questions/684074

답변을 보고 컴파일러가 안 해주도록 만들어진 거고 그 이유는 런타임에 내용을 바꾸고 싶다면
한 글자씩 바꾸는 방식으로 사용하도록 의도적으로 그렇게 정해 놨기 때문이라고 답변해주신 건 이해가 됬습니다.
그런데

그렇다고 안해주는 이유가 아예 없는 것은 아닌데 "Start something" 같은 문자열은 컴파일 할 때 프로그램에 탑재됩니다

라는 말씀이 이해가 잘 안됩니다.
문자열이 컴파일할 때 프로그램에 탑재되는 거랑 컴파일 타임이 아니라 런타임에 내용을 바꾸고 싶다면
한 글자씩 바꾸라고 의도적으로 정해 놓은 거랑 무슨 상관인지 모르겠습니다.

답변 항상 감사합니다.

답변 2

2

홍정모님의 프로필 이미지
홍정모
지식공유자

원 질문글에 대한 답변이 틀린 부분이 있어서 수정해 놓았습니다.

간단히 요약하면 C언어에서 배열 대입을 안해주기 때문입니다.

제가 틀린 부분은 이 오류는 Text segment가 read-only인 것과는 상관 없다는 점입니다. 부연 설명도 같이 적어놨습니다.

  • 아래 AI 자동 답변은 저와 무관합니다.

0

안녕하세요, 인프런 AI 인턴입니다. berorowulf님의 질문과 관련하여, 질문자님이 이해가 안 되는 부분을 명확하게 짚고 싶어서 유사한 질문에 대한 답변 링크를 제공하고자 합니다.

해당 질문과 매우 유사한 내용으로, 이전에 강의 수강생이 질문했던 “강의 10:21) 배열의 이름 dest에 “Start something”을 대입하는 것이 안되는 이유“라는 질문이 있습니다. 강의 중 “dest = “Start something”; // Error” 부분에서 나타나는 에러는 문자열 리터럴 “Start something”이 컴파일 시 프로그램에 탑재되어 런타임에 내용을 변경하지 못하도록 읽기 전용 메모리 영역, 즉 컴파일러에 의해 프로그램의 텍스트 세그먼트에 할당되기 때문입니다. 배열의 이름은 변경 불가한 주소 값을 갖는 포인터이기 때문에, 다른 주소로 변경하는 것이 허용되지 않습니다.

질문자님이 말씀하신 “컴파일 타임이 아니라 런타임에 내용을 바꾸고 싶다면 한 글자씩 바꾸라고 의도적으로 정해 놓은 거”는 프로그래머가 런타임에서 안전하고 유효한 메모리 상에서 값을 변경할 수 있도록 하기 위한 것입니다. 즉, 문자열 리터럴의 경우 변경이 되서는 안 되는 읽기 전용 메모리에 위치하므로, 이를 직접 변경하는 것이 아니라 이와 유사한 값을 가진 새로운 배열을 생성하고 해당 배열의 각 문자 요소를 변경하는 식으로 사용해야 합니다.

또한, 이러한 메모리 관리 및 문자열 할당의 원리를 더 깊이 이해하고자 한다면 C 언어의 메모리 관리와 문자열에 대한 보다 상세한 강의 내용이나 참고 자료를 학습하는 것을 추천드립니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

용개형멋져님의 프로필 이미지
용개형멋져

작성한 질문수

질문하기