인프런 커뮤니티 질문&답변

CJS님의 프로필 이미지
CJS

작성한 질문수

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

14.6 구조체와 포인터

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

작성

·

429

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 구조체와 할당 메모리 에서 직접 구조체와 관련된 함수들을 구현하시면서 보다 자세히 학습하시게 됩니다.


개인적인 의견으로, 질문은 궁금하신 점이 생기실 때 편하게 해주시는 것이 좋다고 생각합니다. 전혀 죄송하실 필요가 없습니다.
오히려 코드도 직접 첨부해주시는 등 여러모로 존중해주시는 점이 느껴져서 감사할 따름입니다.

CJS님의 프로필 이미지
CJS

작성한 질문수

질문하기