Search
Duplicate
🥊

char *str = “abc”와 char str[] = “abc”의 차이!

간단소개
문자열 선언할 때에 전자 형식을 사용하면 수정이 불가하고 후자 형식을 사용하면 수정이 가능한 이유에 대해 알아보았습니다!
팔만코딩경 컨트리뷰터
ContributorNotionAccount
주제 / 분류
C
Scrap
태그
9 more properties
라피신 시절 exam에서 테스트를 위해 만든 main 함수가 잘못된 줄도 모르고… 계속되는 버스에러에 고생을 꽤나 했었다! 원인을 알았을 때에도 왜 char *str으로 선언이 되면 수정이 불가하고 char str[]으로 선언이 되면 수정이 가능한지에 대한 명확한 이유를 모르고 지나갔는데, libft 스터디를 진행하면서 시원하게 알게 되어서 이 글이 적게 되었다!

메모리 영역

우리가 프로그래밍을 할 때 사용하는 메모리는 크게 4가지 영역으로 나뉠 수 있다.
코드 영역 (텍스트 영역) :
실행 가능한 기계어 코드가 저장되는 공간
프로그램이 시작될 때 메모리에 로드
읽기 전용 (이 글의 결론..!)
데이터 영역 :
초기화 된 전역 및 정적 변수가 저장되는 공간
읽기 및 쓰기 가능
힙 영역 :
동적 메모리 할당 및 해제할 때 사용
FIFO (First-In-First-Out)
스택 영역 :
지역 변수 및 함수 호출 시에 사용
LIFO (Last-In-First-Out)
위의 파란색 두 영역은 컴파일이 될 때 미리 크기가 고정이 된다.
아래의 노란색 두 영역은 런타임에 크기가 결정이 되며 스택은 아래에서부터 위로, 힙은 위에서부터 아래로 메모리가 할당이 된다.
이때 이러한 할당의 방향은 아래와 같이 설명할 수도 있다.
힙 : 낮은 주소 → 높은 주소 (따라서 선입선출)
스택 : 높은 주소 → 낮은 주소 (따라서 후입선출)

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

이제 위의 두 선언문을 살펴보자.
char *str = “abc”
에서 문자열 “abc”는 위의 네가지 메모리 영영 중 [코드] 영역에 저장이 된다.
그러면 str이라는 char 포인터 변수는 “abc”의 시작인 a를 가리키는 주솟값을 가지고 있게 된다.
이때 해당 문자열 자체는 읽기 전용인 코드 영역에 속해 있으므로 수정이 불가하다.
한편,
char str[] = “abc”
에서도 마찬가지로 문자열 “abc”가 [코드] 영역에 저장되는 것까지는 동일하다. 하지만 배열로 선언이 된 변수이므로 해당 문자열의 내용 전체를 복사하여 스택 영역에 다시 저장을 하는 과정을 거치게 된다. 스택 영역은 런타임에 선언 및 해제가 되는 영역이므로 수정이 가능하다.
reference