구조체의 복사에서 멤버가 문자열인경우
541
작성한 질문수 22
#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
2
안녕하세요, 답변 도우미 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 구조체와 할당 메모리 에서 직접 구조체와 관련된 함수들을 구현하시면서 보다 자세히 학습하시게 됩니다.
개인적인 의견으로, 질문은 궁금하신 점이 생기실 때 편하게 해주시는 것이 좋다고 생각합니다. 전혀 죄송하실 필요가 없습니다.
오히려 코드도 직접 첨부해주시는 등 여러모로 존중해주시는 점이 느껴져서 감사할 따름입니다.
Export template 안됨
1
19
2
완전히 똑같이 따라해도 exe파일이 안만들어져서 실행이 안됩니다.
1
54
3
main 함수에서 왜 int만 선언이 되는걸까요
1
56
2
8비트 2진수 변환시 왜 1을 더해야하나요?
1
54
2
혹시 강의를 빠르게 수강하려면 어디서부터 듣는게 좋을까요?
1
49
1
프로토타입과 함수간의 인자 불일치
1
73
2
12.12 헤더 관련 질문
1
60
2
Visual Studio Community 2026 사용 문의
1
137
2
Q. 15:30, 부호가 있는 8비트 정수 질문
1
61
2
getchar(), putchar()
1
93
3
강의자리ㅛ
1
80
2
비주얼스튜디오코드로 공부해도 상관없나요?
1
113
2
소스파일안에 여러 파일
1
76
2
F5와 F7의 차이
1
76
2
c = TWO * (a+b); 에서 a와 b는?
1
58
2
; 세미콜론을 붙이는 기준에 문의
1
69
1
Step over 기능 문의
1
53
2
2.6 강의 따옴표 출력 규칙 문의
1
74
2
int main 함수 관련 오류 문의
1
67
2
13.4 words[0]
0
61
2
11.7 함수를 구현해 봤습니다.
1
62
2
11.6 직접 strcmp와 strncmp를 구현해 보았습니다.
1
65
2
11.6 my_strcat과 my_strncat을 구현해봤습니다.
1
53
2
11.6 fit_str함수를 구현해 봤습니다.
1
53
2





