C语言结构体赋值与深拷贝
在C语言中,可以通过直接赋值的方式将两个相同类型的结构体变量互相赋值。编译器会执行逐成员拷贝(member-wise copy),即将源结构体的每个成员的值复制到目标结构体的对应成员中。
示例代码
#include <stdio.h>
#include <string.h>// 定义结构体类型
struct Person {char name[50];int age;float height;
};int main() {// 定义两个结构体变量struct Person person1 = {"Alice", 25, 170.5};struct Person person2;// 将person1的值赋给person2(直接赋值)person2 = person1;// 修改person1的成员,验证person2是否独立strcpy(person1.name, "Bob");person1.age = 30;person1.height = 180.0;// 打印结果printf("person1: %s, %d, %.1f\n", person1.name, person1.age, person1.height);printf("person2: %s, %d, %.1f\n", person2.name, person2.age, person2.height);return 0;
}
输出结果
person1: Bob, 30, 180.0
person2: Alice, 25, 170.5
关键点说明
-
直接赋值:相同类型的结构体变量可以直接用
=
赋值,编译器会自动处理成员拷贝。 -
深拷贝与浅拷贝:
-
如果结构体包含指针成员,直接赋值仅拷贝指针地址(浅拷贝),不会复制指针指向的数据。
-
如果结构体包含数组或基本类型,直接赋值会复制完整的值(深拷贝)。
-
-
动态内存注意事项:
-
若结构体中有指针指向动态分配的内存,直接赋值可能导致双重释放或内存泄漏。此时需要手动实现深拷贝(如
memcpy
或逐成员赋值)。memcpy具体使用可以参考前文:memcpy 使用指南 (C语言)-CSDN博客
-
指针成员的深拷贝示例
#include <stdlib.h>
#include <string.h>struct Data {int *values;int count;
};void deepCopyData(struct Data *dest, const struct Data *src) {dest->count = src->count;dest->values = (int *)malloc(src->count * sizeof(int));memcpy(dest->values, src->values, src->count * sizeof(int));
}int main() {struct Data data1 = {(int[]){1, 2, 3}, 3};struct Data data2;deepCopyData(&data2, &data1); // 手动深拷贝// 释放内存(实际使用中需处理错误)free(data2.values);return 0;
}
总结
-
相同类型的结构体:直接
=
赋值即可。 -
含指针的结构体:需手动实现深拷贝,避免共享内存。