티스토리 뷰

string s = "LEO";

사실 c에는 string이라는 자료형이 없다. 그 간 string이라는 자료형은 만들어진 것이며, 이를 사용하기 위해 라이브러리에서 불러온다는 것은 알고 있었다.

그렇다면 string 자료형은 내부적으로 어떻게 구현이 되어있는 것일까?

전에도 언급했듯이 string은 단지 char의 배열이다. 내부적으로 보면 메모리에 L, E, O, \0(널 종단문자) 순서대로 저장되어있을 것이다. 그러면 변수 s는 어떤 값을 저장하고 있는 것인가?

변수 s는 char 배열의 가장 첫 번째 글자인 L이 위치한 메모리 주소를 값으로 갖고 있다. 즉, s는 포인터 변수이다. s는 char 배열의 첫 번째 글자의 주소만 알고 있고, 그 주소에서부터 시작해서 널 종단 문자가 나올 때까지 loop를 돌 뿐이다.

즉 c에서의 string은 primitive value가 아니라 객체라고 할 수 있다.

그러므로 string은 사실 아래처럼 정의된 커스텀 타입이다. char의 포인터 변수이며, 이름은 string인 타입인 것이다.

typedef char *string;

그렇다면 라이브러리에서 불러오지 않고 string을 나타내보자.

#include<stdio.h>

int main(void)
{
  char *s = "LEO"; //double quote
  printf("%s\n", s); // LEO 출력
  printf("%c\n", *s); // L 출력
  printf("%p\n", s); // 주소 출력
  printf("%p\n", &s[0]) // 위와 똑같은 주소 출력
}

여기서 의문을 가졌던 부분이, printf("%s\n", s) 했을 때 LEO라는 값이 출력된다는 것이었다. 언뜻 생각했을 때는 s가 포인터 변수라 printf("%s\n", *s) 이렇게 s앞에 애스터리스크를 붙여줘야 그 주소로 가서 값을 가져오지 않나 싶었다. 알고보니 s라는 형식지정자가 char * 형식을 나타내는 것이어서 괜찮은 거 였다.

그리고 형식지정자를 p로 설정하면 첫 번째 글자인 L이 저장된 주소를 출력하고, &s[0] 를 해도 L의 주소값을 의미하므로 동일한 주소가 출력된다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함