문자열은 문자형의 배열을 말한다. 문자를 메모리상에 차례대로 둔 것과 같다. 문자열이 메모리 상에 어떻게 배치되는지는 차차 적도록 하고, 문자열에 대해서 좀 알아보면 다음과 같다.

문자열 처리는 프로그래밍에 있어서 많은 부분을 차지한다. 우리가 잘 알고있는 웹브라우져도 일종에 거대한 문자열 해석기와 같다. 웹브라우져는 전송받은 HTML 문서를 똘똘하게 분석하기 시작한다. 분석하는 과정중에는 앞서 쓴 적이 있는 토큰의 개념도 가지며 이제부터 써 내려갈 문자열 처리에 관한 기법들을 브라우져들만의 독자적인 알고리듬을 통해서 TAG 또는 스크립트들을 빨리 처리하기 위해 고군분투하는 것을 알 수 있다. 이외 또 하나의 문자열 분석기는 우리가 잘 아는 컴파일러라 할 수 있다. 컴파일러는 우리가 작성한 코드를 토큰 단위로 보며 이것을 문법이 맞는지 분석을 하고 어셈블리어로 뽑아내기 위해 CPU를 항상 독점 하다싶이 사용한다. 아래는 CPU가 컴파일러에게 능욕당하는 장면.

※컴퓨터 수명이 단축되는 기분이다. CPU의 온도가 약 60도를 웃돈다.

문자 상수와 문자열 상수 비교

  • 문자 상수
    • 'a', '3', '%', '+'
    • 문자 상수는 작은 따옴표로 문자 하나를 둘러 싼다.
    • 문자 상수는 1byte만을 차지한다.
  • 문자열 상수
    • "My name is Raven."
    • 문자열 상수는 따옴표로 다수의 문자 상수들을 둘러 싼 형태이다.
    • 문자열 상수는 강제적으로 컴파일러에 의해 문자열 마지막에 NULL 문자가 추가된다.
    • 추가된 NULL문자로 인하여 실제 적혀있는 문자들의 크기보다 1byte가 많다.

아래의 코드는 실제 적혀있는 문자열의 수와 메모리상에서 차지하고 있는 크기를 알아볼 수 있다.

// 문자열의 길이를 알아보자.

#include <stdio.h>
#include <string.h>

int main()
{
    int length;
    int size;

    length = strlen("My name is Raven");  /* strlen은 문자열에 일는 문자수를 반환한다. NULL문자 제외. */
    size = sizeof("My name is Raven");    /* sizeof 는 문자열이 가지고 있는 메모리 크기를 반환한다. NULL 문자 포함. */

    printf("Length of string : %d\n", length);
    printf("The size of string : %d\n", size);
    
    return 0;
}

<실행결과>

문자열 상수는 프로그램 내의 모든 변수가 심볼 테이블(Symbol Table)에 기록되어 쓰이는 것 처럼 모든 상수도 상수 테이블(Constant Table)에 주소와 함께 등록 된다. 문자열 상수 "My name is Raven"의 값은 상수 테이블 내에 "My name is Raven"이 저장되어 있는 주소를 값으로 가지고 있다.

문자열이 주소를 어떻게 가지는지 간단한 프로그램을 작성해서 알아볼 수 있다.


// 문자열이 저장된 메모리의 주소를 나타내는 프로그램.
#include <stdio.h>

int main()
{
    char *p;                    /* 주소를 저장 할 포인터 P 변수를 생성. */

    printf("%s %p\t\n", "abc", "abc"); /* 문자열은 문자열 그 자체가 주소값을 저장하고 있다는 것을 알 수 있다. */
    printf("%s %p\t\n", "abc", "abc"); /* 한번 선언된 문자열은 다시 선언한다고 해서 위치가 변하거나 다른 주소를 가지지ㅈ 않는다. */

    p = "abc";                  /* 포인터 p에 문자열 "abc"의 주소를 넣는다. */

    printf("%s %p\t\n", p, p);  /* p는 문자열 "abc"의 값을 출력한다. */
    
    return 0;
}

여기서 주목해야할 점은 "abc"가 가진 값이 무엇인가 하는 점이다. 저기서 출력한 것은 적혀있는 "abc" 그대로를 출력한 것인가 아니면 어떠한 메모리 영역에 자리잡고 있는 abc를 출력한 것인가? 위의 코드와 결과에서 봤듯이 문자열 상수 "abc"는 상수 테이블에서 자신에게 주어진 주소를 참고하여 메모리 영역(CODE 영역)에 저장되어있는 자신의 값을 출력한다.


신고

'컴퓨터 언어 > C' 카테고리의 다른 글

메세지 기법  (0) 2013.01.16
배열의 이름은 첫번째 원소의 주소이다.  (0) 2012.12.20
문자열, 그것은 배열.  (2) 2012.06.11
Makefile을 작성하자.  (2) 2012.06.10
다수의 소스 컴파일을 도와줄 Make  (2) 2012.06.10
ASCII Code는?  (1) 2012.06.09


티스토리 툴바