작성
·
412
1
#include <stdio.h>
#include <stdlib.h>
struct data
{
int a;
char str[20];
};
int main(void)
{
struct data data1 = { 1,"hello" };
struct data data2 = data1;
printf("%s", data2.str);
return 0;
}
강의 7:40를 보면 구조체 변수에 다른 구조체 변수를 대입하면 그 안의 값이 똑같이 복사가 가능한데,
문자열도 복사가 가능한지 궁금해서 위처럼 실행시켜보니까 가능하네요.
이것은 마치
data1.str = "hello";
data2.str = data1.str;
인 것 같은데.
제가 알기론 문자열은 대입을 통해서 복사 하는 것이 불가능한 것으로 알고 있는 구조체에서는 가능한건가요?
미흡한 질문 죄송합니다.
답변 1
1
안녕하세요, 답변 도우미 Soobak 입니다.
먼저, 깊은 복사(Deep copy) 와 얕은 복사(Shallow copy) 의 개념에 대해 요약 설명 드린 후, 질문주신 내용에 대해 답변을 드리도록 하겠습니다.
깊은 복사
: 데이터의 실제 값을 새로운 메모리에 복사합니다. 원본 데이터와 복사된 데이터는 서로 독립적입니다.
얕은 복사
: 데이터의 메모리 주소를 복사합니다. 원본 데이터와 복사된 데이터는 동일한 메모리 위치를 참조하므로, 한 쪽에서 변경을 하면 다른 쪽도 영향을 받게 됩니다.
질문해주신,
struct data
{
int a;
char str[20]
};
의 경우에서, 구조체의 멤버로 기본 데이터 타입이나 문자 배열이 있을 때는, 대입 연산자 =
을 사용하면 그 값들이 모두 깊은 복사가 됩니다.
따라서,
int main(void)
{
struct data data1 = { 1,"hello" };
struct data data2 = data1;
printf("%s", data2.str);
return 0;
}
에서 data2
구조체의 str
문자 배열이 정상적으로 복사되어 출력된 것입니다.
하지만, 구조체의 멤버가 포인터일 경우, 단순 대입 연산자 =
만을 사용하면 포인터의 값(메모리 주소)만 복사가 됩니다. 따라서, 포인터를 가진 구조체의 깊은 복사에 대해서는 동적 메모리 할당 및 관리, strcpy()
함수 사용 등의 추가적인 작업이 필요합니다.
관련 내용은 강의 14.9 구조체와 할당 메모리 에서 직접 구조체와 관련된 함수들을 구현하시면서 보다 자세히 학습하시게 됩니다.
개인적인 의견으로, 질문은 궁금하신 점이 생기실 때 편하게 해주시는 것이 좋다고 생각합니다. 전혀 죄송하실 필요가 없습니다.
오히려 코드도 직접 첨부해주시는 등 여러모로 존중해주시는 점이 느껴져서 감사할 따름입니다.