이미 저장되어 있는 문자열을 다른 곳에 복사하려면 어떻게 해야 할까?
문자열을 복사하기 위해 아래의 코드를 실행해보자.
#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'라는 문자열이 아닌 그 문자열이 있는 메모리의 주소가 저장되기 때문에 s
와 t
모두 첫 글자가 대문자로 바뀌었다.
string s
는 char *s
와 동일한 의미이다. 따라서 t
도 s
와 동일한 주소를 가리키고 있고, 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
배열에 복사해주면 된다.
생각해보기
배운 바와 같이 메모리 할당을 통해 문자열을 복사하지 않고, 단순히 문자열의 주소만 복사했을 때는 어떤 문제가 생길까?
정답
값이 복사되지 않고, 같은 주소만 가르키게 되어 의도와 다르게 원본이 훼손될 수 있다.