[메모리] 문자열 복사

·

2 min read

[메모리] 문자열 복사

이미 저장되어 있는 문자열을 다른 곳에 복사하려면 어떻게 해야 할까?

문자열을 복사하기 위해 아래의 코드를 실행해보자.

#include <cs50.h>
#include <ctype.h>
#include <stdio.h>

int main(void)
{
    string s = get_string("s: ");
    string t = s;

    t[0] = toupper(t[0]);

    // 입력값을 'emma'로 주면 다음과 같이 출력된다.
    printf("s: %s\n", s);  // Emma
    printf("t: %s\n", t);  // Emma
}

s라는 변수에는 'emma'라는 문자열이 아닌 그 문자열이 있는 메모리의 주소가 저장되기 때문에 st 모두 첫 글자가 대문자로 바뀌었다.

string schar *s와 동일한 의미이다. 따라서 ts와 동일한 주소를 가리키고 있고, t를 통한 수정은 s에도 그대로 반영이 되는 것이다.


두 문자열을 실제로 메모리상에서 복사하려면 다음과 같이 메모리 할당 함수를 사용하면 된다.

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

int main(void)
{
    char *s = get_string("s: ");
    char *t = malloc(strlen(s) + 1);

    for (int i = 0, n = strlen(s); i < n + 1; i++)
    {
        t[i] = s[i];
    }

    t[0] = toupper(t[0]);

    // 입력값을 'emma'로 주면 다음과 같이 출력된다.
    printf("s: %s\n", s);  // emma
    printf("t: %s\n", t);  // Emma
}

maloc이라는 함수는 정해진 크기 만큼 메모리를 할당하는 함수이다. s 문자열의 길이에 널 종단 문자(\0)에 해당하는 1을 더한 만큼 메모리를 할당한다.

그리고 루프를 돌면서 s문자열 배열에 있는 문자 하나 하나를 t배열에 복사해주면 된다.


생각해보기

배운 바와 같이 메모리 할당을 통해 문자열을 복사하지 않고, 단순히 문자열의 주소만 복사했을 때는 어떤 문제가 생길까?

정답

값이 복사되지 않고, 같은 주소만 가르키게 되어 의도와 다르게 원본이 훼손될 수 있다.