본문 바로가기

프로그래밍

c++의 string 자료형

c++에서 문자열을 담을때 char 배열에 담을 수 있고, 아니면 char *, string 자료형을 지원한다.

 

char 형 배열은 c와 동일하게 스택에 공간이 만들어지기 때문에 각각의 인덱스에 접근해서 값을 변경할 수 있다는 특징이 있지만, 

같은 자료형, 같은 크기의 배열이라도 통째로 대입하는게 불가능하다.

char str1[11] = "HelloWorld";
char str2[11];
str2 = str1;  // <- 불가능

 

char * 역시 C와 마찬가지로 문자열을 바로 집어넣는다면, 저장되는 문자열은 읽기전용 메모리인 .data영역에 저장되어 인덱스 접근해서 읽기는 가능하지만, 쓰기가 불가능하다. char *변수는 스택에 저장되고 리터럴 문자열의 주소를 가리키게 되는구조이다.

 

C++에서는 string 이라는 자료형을 지원한다.

이녀석은 하는 행동이 일반적이지 않다.

-> c_str()이라는 메서드는 string 객체를 c스타일로 새로운 배열에 할당 후 그 주소를 리턴해주는 함수이기 때문에 아래와 같은 결과가 나오게된다.

string str1 = "test1313";
string str2;
str2 = str1;
str1[2] = 'X';
cout << str1 << endl;  // -> teXt1313
cout << str2 << endl;  // -> test1313

일단 스택공간에 각각 24, 28바이트 공간이 할당되고, char형 배열처럼 각 바이트 공간을 문자로 하나씩 채운다.

대략 22 바이트까지는 스택에 배열형태로 존재하게 되지만, 그 이상 길이의 문자열이 들어오는 경우 힙 공간에 할당된다.

 

 

문자열이 길이서 힙에 할당된다고 해도 배열의 공간은 할당된 채로 유지된다.

아래 사진에서 a, str1, b, str2, c 순서대로 선언됐고, str1의 문자열 길이가 길기때문에 힙 공간에 저장됐다.

하지만 a, b, c의 주소는 대략 32바이트씩 떨어져있게 된다.

 

 

힙공간에 한번 할당되고나면 문자열 크기를 줄인다 해도 힙공간에 그대로 남아있게 된다. 

 

 

힙공간에 할당되어 있지만, free는 불가능하다.

.c_str()로 접근해도 불가능하다.

delete도 안됨

 

!!! 결론 !!!

string이라는 클래스같은게 있고, 그 클래스안에는 메소드들이 있는데 그중 하나가 c_str()인것같다.

전체 28바이트중에 22바이트정도가 넘어갔을때 힙으로 이동하는 이유는 기본적으로 22바이트까지 담을 수 있고, 그 다음엔 바로 저장한 바이트의 길이를 담는 필드가 2byte로 존재한다.

ccp로 따졌을때 ccp[16]부터 [43] 까지 str2 string이다.

문자열이 대략 300byte로 길어져서 힙메모리로 이동됐을때

스택에 있는 string 변수는 힙메모리의 주소(ccp[16]~ccp[23] 8byte)와 길이(ccp[24-25] 2byte)를 저장하고 있다. (4byte 이상 일지도 모름 총 5byte가 남기때문)

스택에 최대로 존재하는 경우 사이즈를 포함한 남는 메모리(파란색)

 

스트링 클래스 관련 메소드

https://blockdmask.tistory.com/338

 

c++의 진짜 스트링 클래스

https://wiki.kldp.org/HOWTO/html/C++Programming-HOWTO/standard-string.html

 

string to char *

https://www.techiedelight.com/convert-std-string-char-cpp/

 

 

 

 

'프로그래밍' 카테고리의 다른 글

C++ 상속  (0) 2021.11.07
c++ 연산자 오버로딩  (0) 2021.11.06
C++ 정리 (복잡한건 따로 정리함)  (0) 2021.11.06
C++ friend 키워드  (0) 2021.11.06
c++ 클래스 사용 예제  (0) 2021.11.05