다음 이미지는 실제 프로그램이 메모리에 올라갈때 각 메모리 영역...
어셈블리 해보신분은 익숙하겠지만, 명령어들이 죽있고, 명령어들이 참조하는 자료는 모두 자료가 있는 주소를 사용합니다.
그래서 초기화나 값 변경에 사용된 자료들은 모두 데이터 영역에 들어있고, 명령어는 이 데이터 영역의 주소만 가져다 씁니다.
따라서 명령어 영역과 데이터 영역은 프로그램의 설계대로의 동작을 보장하기 위한 영역으로, 메모리에 올라있을 때는 OS가 접근을 금지시키는 영역입니다.(프로그램 실행전에 실행파일에서 수정하는건 됩니다.)
그리고 실제로 사용자가 사용하는 변수, 동적할당 영역은 heap입니다.
문제에서 str1은 heap에 있지만, str1이 가리키는 "abcdef"는 데이터영역에 있기 때문에 수정하려고 하면 메모리접근에러가납니다.
str2는 heap에 있으며, 배열이기 때문에 7칸짜리 배열을 heap에 할당한 후, 그 곳에 데이터영역의 "ABCDEF"를 복사해 넣습니다.
문자열을 상수로 사용해야할 경우라면 할당과 복사부분이 없으니 첫번째 경우가 조금 더 빠른 속도를 보장하고 데이터영역의 메모리를 절감하는(실행파일의 크기가 작아지는) 효과를 가져오지만, 수정하려고 하면 에러가 납니다.
데이터를 수정해야하는 경우는 str2 처럼 사용해야 합니다.