inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

홍정모의 따라하며 배우는 C언어

14.6 구조체와 포인터

구조체의 복사에서 멤버가 문자열인경우

541

CJS

작성한 질문수 22

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;

인 것 같은데.

제가 알기론 문자열은 대입을 통해서 복사 하는 것이 불가능한 것으로 알고 있는 구조체에서는 가능한건가요?

미흡한 질문 죄송합니다.

c

답변 1

2

Soobak

안녕하세요, 답변 도우미 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