YUYANE

C / char 이용해서 문자열 선언하기 본문

Programming Languages/C

C / char 이용해서 문자열 선언하기

YUYA 2021. 1. 21. 10:58

학습 강의

www.boostcourse.org/cs112/lecture/119009

 

C언어에는 문자열을 저장하는 자료형인 string이 없다.

따라서 char 를 사용해서 문자열을 담아야 하는데, 두 가지 방법이 있다.

 

 

포인터를 사용하거나, 배열을 사용하거나

char *str = "There is no string";
char str_[] = "There is no string";

 

 

그런데 string이라는 개념은 존재한다.

printf 를 사용해서 출력을 하려면 다음과 같이 코드를 작성해야 한다. 

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

 

'%s' 대신에 '%c'를 다음과 같이 컴파일 오류가 난다.

 

 

 

포인터 vs [ ]

 

char *str 은 메모리 주소를 담고, char str_[]는 문자열 값을 가진다.

char *str 은 문자열의 값을 바꿀 수 없고, char str_[]는 문자열의 값을 바꿀 수 있다.

 

 

포인터

char 는 문자가 하나만 있는 변수이기 때문에 메모리 크기는 1바이트이다.

그런데 문자열의 크기는 1바이트를 넘어서니깐 변수에 직접 저장하는 대신 포인터를 이용해서 주소를 저장하는 것이다.

나중에 읽을 때 메모리 주소를 보고 문자열이 저장 된 위치로 이동한다.

 

 

문자열의 메모리 크기

 

기본 자료형들은 각각 차지하는 메모리 크기가 있다. 예를 들어 char 는 1바이트, int 는 4바이트 등

문자열의 메모리 크기는 어떻게 정해질까?문자열 안에 있는 문자(char)의 갯수에 비례해서 정해질 것이다.

그런데 일반 배열 자료형과 달리 추가로 1 바이트가 더 필요하다.

 

출처 : dasima.xyz/c-array-sizeof/

 

만약에 4개의 int 형 정수를 담은 배열이 있다면, 그 배열의 메모리 크기는 4 * 4 = 16바이트가 될 것이다.

반면에 char형 배열은 그 길이를 처음부터 정해주지 않기 때문에 메모리 크기가 얼마나 될 지 알 수 없다.

그래서 char형 배열은 문자열이 끝나면 추가로 '\0' 표시를 붙여서 문자열이 끝났다는 신호가 붙는다.

'\0'이 추가로 1 바이트가 더 필요한 이유이다.

 

 

출처 : https://www.boostcourse.org/cs112/lecture/119016

 

위 이미지는 "Hi!"를 담은 변수의 메모리 구조를 보기 쉽게 나타낸 그림이다.

끝에 '\0'이 붙기 때문에 해당 변수가 차지하는 메모리 크기는 3바이트가 아니라 4바이트가 된다.

 

 

int main(void)
{
    string names[4];
    names[0] = "EMMA";
    names[1] = "RODRIGO";
    names[2] = "BRIAN";
    names[3] = "DAVID";
    
    printf("%s\n", names[0]);
    printf("%c%c%c%c%i\n", names[0][0], names[0][1], names[0][2], names[0][3], names[0][4]);
}

 

다른 것은 무시하고, 맨 마지막 줄만 보자.

names[0] = "EMMA" 이기 때문에 names[0][4] = '\0'이 될 것이다.

즉, 문자열이 끝났음을 알리기 위한 다섯 번째 문자열의 값이 존재 하기 때문에 출력 결과는 다음과 같다.

(학습용으로 출력했을 뿐, 굳이 출력할 필요는 없다.)

 

 

참고 사이트

blog.naver.com/chhh92/220022245722

dojang.io/mod/page/view.php?id=328

dasima.xyz/c-array-sizeof/

'Programming Languages > C' 카테고리의 다른 글

C / 컴파일 과정에 대해서  (0) 2021.01.25
C / 포인터 사용하기 (코드리뷰)  (0) 2021.01.22
C / 전역변수 사용이 나쁜 이유  (0) 2021.01.22
C / 오버플로우  (0) 2021.01.19
C / 컴파일러의 역할  (0) 2021.01.18
Comments