라피신 시절 exam에서 테스트를 위해 만든 main 함수가 잘못된 줄도 모르고… 계속되는 버스에러에 고생을 꽤나 했었다! 원인을 알았을 때에도 왜 char *str으로 선언이 되면 수정이 불가하고 char str[]으로 선언이 되면 수정이 가능한지에 대한 명확한 이유를 모르고 지나갔는데, libft 스터디를 진행하면서 시원하게 알게 되어서 이 글이 적게 되었다!

메모리 영역

우리가 프로그래밍을 할 때 사용하는 메모리는 크게 4가지 영역으로 나뉠 수 있다.

Untitled

코드 영역 (텍스트 영역) :


데이터 영역 :


힙 영역 :


스택 영역 :

위의 파란색 두 영역은 컴파일이 될 때 미리 크기가 고정이 된다.

아래의 노란색 두 영역은 런타임에 크기가 결정이 되며 스택은 아래에서부터 위로, 힙은 위에서부터 아래로 메모리가 할당이 된다.

이때 이러한 할당의 방향은 아래와 같이 설명할 수도 있다.

힙 : 낮은 주소 → 높은 주소 (따라서 선입선출)

스택 : 높은 주소 → 낮은 주소 (따라서 후입선출)

char *str = “abc” vs char str[] = “abc”

이제 위의 두 선언문을 살펴보자.

char *str = “abc”

에서 문자열 “abc”는 위의 네가지 메모리 영영 중 [코드] 영역에 저장이 된다.

그러면 str이라는 char 포인터 변수는 “abc”의 시작인 a를 가리키는 주솟값을 가지고 있게 된다.

이때 해당 문자열 자체는 읽기 전용인 코드 영역에 속해 있으므로 수정이 불가하다.

한편,