c/C++에서 구조체를 복사하는 방법

오늘은 C/C++에서 구조체를 복사하는 몇 가지 방법을 보여드리겠습니다.

접근법 1



이 접근 방식에서는 구조체의 속성별로 속성을 다른 구조체에 복사하여 복사본을 만듭니다. 나머지 코드는 자체 설명 가능합니다.

암호

#include <stdio.h>
#include <string.h>

typedef struct {
    char name[63];
    enum { MALE, FEMALE, OTHER } gender;
    int age;
    float height;
} User;

void print_user(User *user) {
    printf(
        "(Name: %s, Gender: %s, age: %d, height %.1f)\n",
        user->name,
        user->gender == MALE ? "Male" :
            user->gender == FEMALE ? "Female" : "Other",
        user->age,
        user->height
    );
}

int main() {
    User user = {"Naman", MALE, 21, 5}, user1;

    // Approach 1 
    strncpy(user1.name, user.name, sizeof(user.name));
    //        ^dest      ^src           ^size to copy 
    user1.gender = user.gender;
    user1.age = user.age;
    user1.height = user.height;

    printf("user: "); print_user(&user);
    printf("user copy: "); print_user(&user1);

    return 0;
}


산출

user: (Name: Naman, Gender: Male, age: 21, height 5.0)
user copy: (Name: Naman, Gender: Male, age: 21, height 5.0)


이 접근법의 단점

이 코드가 구조체를 복사하기 위해 작성되었다는 것은 매우 분명하지만. 하지만 구조체의 크기가 커질수록 모든 속성을 입력하기가 어려워지고 따라서 오타의 가능성도 높아집니다.

그래서 이것에 대한 해결책은 무엇입니까? 다음 접근 방식에 대해 논의해 봅시다.


접근법 2



속성별로 속성을 복사하는 대신 memcpy를 사용하여 전체 구조체를 복사할 수도 있으며 나머지 코드는 동일합니다. 전체 구조체를 한 줄에만 복사하십시오.

// Inherit above code here

int main() {
    User user = {"Naman", MALE, 21, 5}, user1;

    // Approach 2
    memcpy(&user1, &user, sizeof(user));
    //      ^dest   ^src    ^size to copy 

    printf("user: "); print_user(&user);
    printf("user copy: "); print_user(&user1);

    return 0;
}


산출

user: (Name: Naman, Gender: Male, age: 21, height 5.0)
user copy: (Name: Naman, Gender: Male, age: 21, height 5.0)



접근법 3



할당 연산자를 사용하여 구조체를 복사할 수도 있습니다.

암호

int main() {
    User user = {"Naman", MALE, 21, 5}, user1;

    // Approach 3
    user1 = user;

    printf("user: "); print_user(&user);
    printf("user copy: "); print_user(&user1);

    return 0;
}


산출

user: (Name: Naman, Gender: Male, age: 21, height 5.0)
user copy: (Name: Naman, Gender: Male, age: 21, height 5.0)


많은 사람들은 구조체를 이런 식으로 복사할 수 있다는 사실조차 깨닫지 못합니다. 왜냐하면 배열로는 똑같이 할 수 없기 때문입니다. 마찬가지로 함수에서 구조체를 반환하고 할당할 수 있지만 배열은 할당할 수 없습니다. 컴파일러는 뒤에서 우리를 위해 모든 복사 작업을 수행합니다.

NOTE: When dealing with struct pointers approach 3 doesn't work as assigning one pointer to another doesn't make copy instead just point to new memory address. So if we modify new variable, original one is also affected.




❤️잘 읽어주셔서 정말 감사합니다. 틀린 부분이 있으면 댓글로 알려주세요.

이 게시물이 어떤 식으로든 도움이 된다면 공유하고 엄지손가락을 치켜세우는 것도 고려해 보세요.

좋은 웹페이지 즐겨찾기