You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将typedef struct结构体变量的内容复制到另一个同类型变量中?

C语言结构体内容复制的两种常见方式

刚好之前碰到过不少类似的疑问,我来给你拆解清楚两种常用的结构体复制方法:

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
相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 09:08:16