ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 문자열 변수와 상수
    Legacy/C&C++ 2015. 1. 19. 20:22
    728x90

    ■ 문자열을 표현하는 방법은 크게 두가지가 있다.

    char str1[5] = "abcd";   //문자열 변수
    char *str2 = "ABCD";    //문자열 상수


    (1) 문자열 변수
    : 요소가 char형인 str1이라는 이름의 배열을 선언하고, 대입 연산자 오른쪽에 선언된 문자열을 저장하고 있다.
      따라서 str1이 저장하고 있는 문자열은 변수가 된다.

      [      a      |      b      |      c      |      d      |      \0      ]
          str1[0]       str1[1]       str1[2]        str1[3]       str1[4]


    (2) 문자열 상수
    : 대입 연산자의 왼쪽에 char형 포인터를 선언하고, 오른쪽에는 "ABCD"라는 문자열을 선언하고 있다.
      이는 포인터 str2를 이용해서 문자열 상수"ABCD"를 가리키겠다는 의미가 된다.
      따라서 str2는 문자열의 첫 문자 'A'를 가리키게 된다. 포인터의 타입이 char*인 이유도 여기에 있다.

      [●]-----------------> [ A B C D \n ]
     포인터                               문자열 상수



    배열 str1은 문자열 전체를 저장하고 있는 것이고,
    포인터 str2는 메모리에 저장되어 있는 문자열 상수 "ABCD"를 단순히 가리키고만 있다.


    [CODE]
    #include<stdio.h>

    int main()
    {
        char str[5] = "abcd";
        char *str2 = "ABCD";

        printf("%s\n",str);
        printf("%s\n",str2);

        str[0] = 'x';
        str2[0] = 'X';

        printf("%s\n",str);
        printf("%s\n",str2);

        return 0;

    }

    [RESULT]
    abcd
    ABCD
    세그멘테이션 오류


    - str1은 문자열 변수이고, str2는 문자열 상수 이다.
    - str1이 가리키는 문자열은 변수 이므로 문제가 없지만, str2가 가리키는 문자열은 상수이므로 변경 시 문제를 일으킨다.
    - str2[0] = 'X'; 를 주석처리 후 실행하면 정상 처리된다.


    (3) 문자열 상수에 대한 이해
    : 문자열 상수는 메모리 공간에 할당되면 주소를 반환한다.

    char *str = "ABCDEFG"

    - char형 포인터를 선언하고 있고, 대입연산자 오른쪽에 주소값이 오기를 기다린다.
    - 하지만 주소값이 아닌 문자열 상수가 선언되어있다.
    - 이는 문자열 상수는 메모리 공간에 저장되면, 그 순간에 문자열 상수의 주소 값이 반환됨을 말한다.
    - 문자열 상수의 주소는 문자열의 첫 번째 문자의 주소이므로, char형 포인터 타입이다.

    => 문자열 상수 "ABCDEFG"가 0x10번지에 저장이 된다면, 주소값 0x10이 반환되어 포인터 변수 str을 초기화 하게 된다.


    출처 - http://mintnlatte.tistory.com/223

Designed by Tistory.