如何将typedef struct结构体变量的内容复制到另一个同类型变量中?
刚好之前碰到过不少类似的疑问,我来给你拆解清楚两种常用的结构体复制方法:
1. 直接使用second = first赋值
这是最直接简单的方式,只要你的结构体books里没有包含指针类型(或者指针指向的是静态内存,不需要动态管理),直接赋值完全没问题,C语言原生支持结构体的直接赋值操作,它会自动把first里的每个成员变量都复制到second对应的位置上。
举个例子:
#include <stdio.h> typedef struct { char title[50]; int pages; float price; } books; int main() { books first = {"C Primer Plus", 1000, 89.9}; books second; // 直接赋值 second = first; printf("Second book title: %s\n", second.title); printf("Second book pages: %d\n", second.pages); printf("Second book price: %.1f\n", second.price); return 0; }
运行这段代码,你会看到second完全复制了first的所有内容,没有任何问题。
2. 使用专用函数或自定义拷贝函数
如果你的books结构体里包含了指针,而且指针指向的是堆上动态分配的内存,那直接赋值就会出问题——这时候只是复制了指针的地址(也就是浅拷贝),两个结构体的指针会指向同一块内存,后续修改其中一个会影响另一个,甚至会出现重复释放内存的崩溃问题。
这种情况下,你有两种选择:
- 使用
memcpy函数:和直接赋值效果类似,也是浅拷贝,适合结构体里没有动态内存的场景,用法是:memcpy(&second, &first, sizeof(books)); - 自定义深拷贝函数:自己实现一个函数,不仅复制结构体的成员,还要为指针重新分配内存,复制指针指向的内容。比如:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct {
char *title; // 指针指向堆内存
int pages;
float price;
} books;
// 自定义深拷贝函数
void copy_book(books *dest, const books src) {
// 先为目标结构体的title分配内存
dest->title = (char)malloc(strlen(src->title) + 1);
if (dest->title == NULL) {
perror("malloc failed");
exit(EXIT_FAILURE);
}
// 复制字符串内容
strcpy(dest->title, src->title);
// 复制其他非指针成员
dest->pages = src->pages;
dest->price = src->price;
}
int main() {
books first;
first.title = (char*)malloc(50);
strcpy(first.title, "C Primer Plus");
first.pages = 1000;
first.price = 89.9;
books second; copy_book(&second, &first); // 修改first的title,不会影响second strcpy(first.title, "Effective C"); printf("First book title: %s\n", first.title); printf("Second book title: %s\n", second.title); // 记得释放内存 free(first.title); free(second.title); return 0;
}
这样就能保证两个结构体的指针指向不同的内存块,不会互相干扰。 总结一下: - 结构体无动态内存成员:直接`second = first`最简单高效,也可以用`memcpy`,效果一样。 - 结构体有动态内存成员:必须用自定义深拷贝函数,避免浅拷贝带来的问题。 内容的提问来源于stack exchange,提问作者user10967362

