라피신 시절 exam에서 테스트를 위해 만든 main 함수가 잘못된 줄도 모르고… 계속되는 버스에러에 고생을 꽤나 했었다! 원인을 알았을 때에도 왜 char *str으로 선언이 되면 수정이 불가하고 char str[]으로 선언이 되면 수정이 가능한지에 대한 명확한 이유를 모르고 지나갔는데, libft 스터디를 진행하면서 시원하게 알게 되어서 이 글이 적게 되었다!
우리가 프로그래밍을 할 때 사용하는 메모리는 크게 4가지 영역으로 나뉠 수 있다.
코드 영역 (텍스트 영역) :
데이터 영역 :
힙 영역 :
스택 영역 :
위의 파란색 두 영역은 컴파일이 될 때 미리 크기가 고정이 된다.
아래의 노란색 두 영역은 런타임에 크기가 결정이 되며 스택은 아래에서부터 위로, 힙은 위에서부터 아래로 메모리가 할당이 된다.
이때 이러한 할당의 방향은 아래와 같이 설명할 수도 있다.
힙 : 낮은 주소 → 높은 주소 (따라서 선입선출)
스택 : 높은 주소 → 낮은 주소 (따라서 후입선출)
이제 위의 두 선언문을 살펴보자.
char *str = “abc”
에서 문자열 “abc”는 위의 네가지 메모리 영영 중 [코드] 영역에 저장이 된다.
그러면 str이라는 char 포인터 변수는 “abc”의 시작인 a를 가리키는 주솟값을 가지고 있게 된다.
이때 해당 문자열 자체는 읽기 전용인 코드 영역에 속해 있으므로 수정이 불가하다.
한편,