안녕하세요.
사용 컴파일러 : codeblock
문자열을 저장하는 공간을 다음과 같이 포인터 변수에 메모리를 할당 했을 때
char *s1 = malloc(sizeof(char) * 10);
scanf 함수를 이용하여 iamaboy를 입력한 경우와
s1 = "iamaboy"를 대입한 경우 각각에 대해
"iamaboy" string 중간에 있는 임의 어떤 문자를 다른 문자로 변경하고자 했을 때
scanf를 사용한 경우는 임의 문자로 변경이 되는데
s1 = "iamaboy"로는 임의 문자로 변경이 되지 않고 오류가 발생합니다.
포인터 변수에 메모리를 할당한 후 s1 = "iamaboy"로 대입을 해주면 이 경우도 리터럴인가요? 아니며 다른 어떤 원인으로 컴파일 오류가 발생되는지요? 이와 관련된 내용은 책의 어느 부분을 확인하면 좋을 까요?
읽어 주셔서 감사합니다.
감사합니다.
문자열을 저장하는 공간을 포인터 변수에 할당하고, scanf 함수를 사용하여 문자열을 입력받은 경우와 s1에 문자열을 대입한 경우에 대해 임의의 문자를 변경하려고 할 때, 그 결과가 다른 이유는 다음과 같습니다.
scanf를 사용한 경우:
- scanf 함수를 사용하여 문자열을 입력받을 때, 입력받은 문자열은 할당된 메모리 공간에 저장됩니다.
- 이 경우, 문자열은 할당된 메모리 공간에 직접 저장되므로 해당 메모리를 변경할 수 있습니다.
s1에 문자열을 대입한 경우:
- s1 = "iamaboy"와 같이 문자열 리터럴을 s1에 대입하는 경우, 문자열 리터럴은 프로그램의 데이터 영역에 저장됩니다.
- 문자열 리터럴은 일반적으로 수정할 수 없는 상수로 취급됩니다. 따라서, 문자열 리터럴에 포인터 변수를 통해 접근하고 변경하는 것은 잘못된 동작입니다.
- s1 = "iamaboy"와 같이 문자열 리터럴을 대입하는 경우, s1은 해당 문자열 리터럴을 가리키는 포인터가 되는 것이지 문자열을 저장하기 위해 동적으로 할당된 메모리가 아닙니다.
따라서, s1 = "iamaboy"로 문자열을 대입한 경우에는 컴파일 오류가 발생하지 않고, 임의 문자로 변경하는 것은 올바른 동작이 아닙니다. 컴파일 오류가 발생하는 것은 기존 문자열 리터럴을 변경하려고 했기 때문이 아니라, 문자열 리터럴 자체가 수정할 수 없는 상수로 간주되기 때문입니다.
이와 관련된 내용은 C 프로그래밍 언어에서 문자열과 문자열 리터럴에 대한 내용을 다루는 부분에서 확인할 수 있습니다. C 언어 관련 책의 문자열 처리 및 리터럴에 대한 섹션 또는 C 문자열 관련 자습서를 참고하시면 도움이 될 것입니다.
좋은 공부 되시기 바랍니다!
상세한 답변 감사드립니다.
동적 메모리가 할당된 s1에 대해
s1 = "xxxxxx";와 같이 " " 내의 문자열은 리터럴을 의미한 것으로 판단해도 되는지요?
https://learn.microsoft.com/ko-kr/cpp/c-language/c-string-literals?view=msvc-170
이 곳에 그러한 내용이 있어 확인 차 여쭙습니다.
그리고
수정할 수 없는 문자열 리터럴은 실제 코딩 시 어떤 부분에 주로 사용이 되는지요?(질문이 좀 애매모호 합니다.ㅜㅜ 이 부분은 답변 주셔도 되고 안주셔도 됩니다.)
감사합니다.
책에도 문자열 리터럴은 설명되어 있습니다.
문자열 리터럴은 "안녕하세요"처럼 코드에 직접 작성된 값을 말합니다.
코드에 직접 작성된 값은 모두 리터럴 값입니다.
문자열 리터럴은 읽기 전용이므로 직접 수정할 수 없습니다.
책을 보고 순차적으로 진도를 빨리 나가세요. 끝까지 통독하시면 전체 상을 더 빠르게 이해할 수 있습니다. 지엽적인 주제에 너무 매몰되지 말고 전체를 빨리 보고 큰 틀을 이해하는 게 좋습니다.