보통 프로그램을 실행하면 프로그램의 정보가 [코드/데이터/스택/힙]과 같은 식으로
영역이 분리되어 메모리에 올라갑니다.
1번과 2번에 공통적으로, "This, a sample string." 문자열은 수정 불가능한 데이터 영역에 자리합니다.
그런데 1번의 경우는 이, 수정 불가능한 데이터 영역의 문자열을 그냥 가리키는 것이므로,
위와 같이 대입 연산을 진행하면 수정 불가능한 데이터 영역의 문자열을 수정하는 것이 되어 런타임 오류가 발생합니다.
2번의 경우는 "This, a sample string."이라는 문자열의 크기만큼 수정 가능한 영역을 확보한 후
(전역에 있는 경우와 함수 내부에서 확보한 경우에 따라 확보하는 영역이 다를 수 있습니다)
이 문자열을 확보한 공간에 복사하는 식으로 작업이 진행되고,
따라서 수정 가능한 영역을 수정하는 것이 되므로 오류가 발생하지 않습니다.
답변
두 대상이 할당되는 영역이 달라서 그렇습니다.
보통 프로그램을 실행하면 프로그램의 정보가 [코드/데이터/스택/힙]과 같은 식으로
영역이 분리되어 메모리에 올라갑니다.
1번과 2번에 공통적으로, "This, a sample string." 문자열은 수정 불가능한 데이터 영역에 자리합니다.
그런데 1번의 경우는 이, 수정 불가능한 데이터 영역의 문자열을 그냥 가리키는 것이므로,
위와 같이 대입 연산을 진행하면 수정 불가능한 데이터 영역의 문자열을 수정하는 것이 되어 런타임 오류가 발생합니다.
2번의 경우는 "This, a sample string."이라는 문자열의 크기만큼 수정 가능한 영역을 확보한 후
(전역에 있는 경우와 함수 내부에서 확보한 경우에 따라 확보하는 영역이 다를 수 있습니다)
이 문자열을 확보한 공간에 복사하는 식으로 작업이 진행되고,
따라서 수정 가능한 영역을 수정하는 것이 되므로 오류가 발생하지 않습니다.
저는 이렇게 생각했습니다.
간단하게 덧붙이면 char * str =
간단하게 덧붙이면
1)은 에러가 나고
2)는 에러가 발생하지 않습니다. 그렇다고 2)가 안전하지는 않습니다.
(얼마전에 C++로 작업하고 있었는데 linux bluetooth 커널이었나 라이브러리 헤더였나.. 일부분이 이렇게 작성 되었더군요..)
댓글 달기