카메라 개발자 공부방(SW)

[14장] 배열과 문자열 본문

Langauge/C

[14장] 배열과 문자열

luckmart 2021. 10. 3. 15:53
반응형

자 오늘은 문자열에 대한 내용 주로 다루겠습니다.

문자와 문자열의 차이를 꼭 아셔야 됩니다.

문자는 입니다.
문자열은 문자들의 집합입니다. (너무나도 당연한 소리 같죠?)

#include <stdio.h>

int main()
{
     printf("%c\n", 'A');
     printf("%s\n", "Hello World\n");
     return 0;
}

// 실행결과
// A
// Hello World

자 이제 집중하셔서 보셔야됩니다.

문자열은 첫 번째 문자를 가리키는 상수 포인터입니다.

#include <stdio.h>

int main()
{
     printf("%p\n", "Hello World\n");
     return 0;
}
// 실행결과
// 008EF91C

 

주소 연산자를 하는 서식 문자(%p)를 사용해보면 "Hello World"의 주소가 출력되는 것을 알 수 있습니다.

이게 과연 누구의 주소일까요? Hello World라는 값이 상수 메모리에 저장이 되어있고, 그 메모리 공간의 첫 번째 주소인 H의 주소 값입니다.
(상수 메모리의 주소라는 것을 꼭 기억해주세요)

 

문자열 상수

Hello World 맨 마지막에 \0 문자도 함께 저장되어있는데요.

\0은 컴퓨터에게 문자열의 끝이 여기까지다 라고 알려주는 표식 같은 것입니다.

 

사람은 문자열을 보면, 어디서부터가 문자열의 시작이고 어디가 끝인지 알 수 있지만 컴퓨터의 경우는 모르기 때문에 이런 표식을 두어 문자열의 끝이라고 알려주는 것입니다.

그래서 문자열 관련 처리를 할 땐 \0 문자까지 1byte를 추가적으로 고려하여 메모리 공간을 할당해야 합니다.

문자열의 첫 번째 문자의 주소기 때문에 아래와 같이 코드를 작성할 수 있습니다.

#include <stdio.h>

int main()
{
    char* pStr = "Hello World";
    printf("%s\n", pStr);
    return 0;
}

// 실행결과
// Hello World

 

pStr이란 포인터 변수는 Hello Wolrd의 H 주소만 저장하고 있습니다.

메모리 그림 (하늘색: 상수메모리)

앞장에서 어떤 메모리 공간의 주소를 알고 있다는 건, 그 메모리 자체의 값을 변경시킬 수 있다고 배웠습니다.

#include <stdio.h>

int main()
{
    char* pStr = "Hello World";
    pStr[1] = 'A';
    printf("%s\n", pStr);
    return 0;
}

// 실행결과
// runtime error occured

얼마든지 위와 같은 형태의 코드를 작성할 수 있지만, 실행 중에 runtime error가 발생을 합니다.

왜 그런지 한번 고민해볼까요?

.

.

.

.

.

.

 

pStr이 가리키는 메모리 공간은 상수 메모리이기 때문입니다.

상수 메모리라 하면 변할 수 없는 메모리 공간을 의미합니다. 그 변할 수 없는 공간에 임의로 다른 값으로 write을 하려다 보니 runtime error가 발생을 한 것입니다.

 

그래서 문자열을 처리가 필요하다면 배열의 메모리를 할당하여 변수 메모리에 저장시켜야 합니다.

#include <stdio.h>

int main()
{
    char buf[32] = "Hello World";
    buf[1] = 'A';
    printf("%s\n", buf);
    return 0;
}

// 실행결과
// HAllo World

배열 메모리

다음 예제는 '\0'가 없는 예제입니다.

#include <stdio.h>

int main()
{
    char buf[32] = "Hello World";
    short length = strlen(buf);
    buf[length] = 'A';
    printf("%s\n", buf);
    return 0;
}

// 실행결과
// Hello World!@#!$@$@$(쓰레기 값)

 

%s는 문자열의 시작 주소에서 \0까지 출력해주는 서식 문자입니다.

\0이 없기 때문에 뒤의 불필요한 메모리 공간까지 전부 출력이 되었습니다.

 

문자열을 위한 처리는 단순 integer 처리보다는 조금 까다롭기 때문에 문자열 처리를 위한 library를 제공해줍니다. 

다음 시간엔 이 library에 대해 공부해보겠습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Langauge > C' 카테고리의 다른 글

[16장] 아스키 코드(ASCII)  (0) 2021.10.05
[15장] 문자열 라이브러리(string.h)  (0) 2021.10.04
[13장] 포인터의 포인터(pointer of pointer)  (0) 2021.10.02
[12장] 포인터와 배열  (0) 2021.10.01
[11장] 배열  (0) 2021.09.30
Comments