Game Develop

[C++] Char*와 Char[]의 차이. 본문

C++/C++

[C++] Char*와 Char[]의 차이.

MaxLevel 2022. 8. 17. 14:53

아래와 같은 코드가 있다고 가정해보고 분석해보자.

 

char* ptc = "Hello";  

 

여기서 Hello는 메모리구조중 하나인 Text Segment에 저장되고 그 주소를 리턴해서 ptc에 저장된다.

반드시 Text Segment에 저장되는게 아니라 Data Segment에 담겨지기도 한다는데, 이는 컴파일러마다 다르다고 한다.

일단 본 글에선 Text Segment라고 가정한다.

 

TextSegment에 대한 설명은 아래와 같다.

  • 프로그램 파일의 내용이 저장된다. 즉, .exe 내용인 기계어. 그리고 3, 'a', "Hello" 같은 리터럴이 저장된다.
  • 개발자가 절대 수정할 수 없는 Read-Only 영역이다.

개발자가 수정할 수 없는 읽기전용의 영역이기 때문에 ptc라는 변수를 이용해서 값을 변경하는건 '불가능' 하다.

예를 들어, ptc[0] = 'a' 라는 식으로 변경이 안된다는 뜻이다. 

애초에 최신버전에서는 char* ptc = "adfadsf" 라고 선언하는것부터가 컴파일 에러가 뜬다.

반드시 앞에 const를 붙여서 const char* ptc = "adfadsf" 라고 선언해야 에러가 뜨지 않는다.

이유는 어차피 수정불가능한 영역이기때문에 애초에 에러를 띄움으로써 개발자에게 조심하라고 경고하는 것이다.

 

그러면 char pta[] = "Hello"; 는 어떨까?

 

일단 배열로 선언할 경우 내용물의 수정이 가능하다. pta[0] = 'B'; 라는 식으로 수정이 가능하다.

그게 가능한 이유는, 일단 배열형식으로 선언해도 Text Segment에 "Hello"가 저장되는것은 포인터형식과 동일하다.

다만 Text Segment에 저장되는것은 '원본'이고, 스택영역에 '사본'을 따로 복사해서 가져온다. 

스택은 읽기전용영역이 아니기 때문에 충분히 수정이 가능하다. 

대신 사본에 대한 메모리도 추가로 잡아먹기 때문에 문자열 크기가 큰 편인데 수정할일도 없다면 const char*형식으로 관리해서 불필요한 메모리소모를 줄이는게 좋다. 굳이 사본을 들고있을 필요는 없으니까.

 

위에 대한 내용은 아래글에서 많은 참고를 했다. 개인적으로 좋은 사이트라고 생각한다.

https://ansohxxn.github.io/c/1/

 

[C] C스타일 문자열의 차이 (char 포인터, char 배열) by 메모리 영역

🚀 메모리 구조와 문자열 리터럴

ansohxxn.github.io