c/C++에서 구조체를 복사하는 방법
9606 단어 cdatastructurescppprogramming
접근법 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.
❤️잘 읽어주셔서 정말 감사합니다. 틀린 부분이 있으면 댓글로 알려주세요.
이 게시물이 어떤 식으로든 도움이 된다면 공유하고 엄지손가락을 치켜세우는 것도 고려해 보세요.
Reference
이 문제에 관하여(c/C++에서 구조체를 복사하는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/namantam1/ways-to-copy-struct-in-cc-3fl3텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)