c语言中的浅拷贝和深拷贝
时间: 2024-09-09 19:17:33 浏览: 98
在C语言中,结构体的拷贝主要有两种方式:浅拷贝和深拷贝。
**浅拷贝**[^1]:
浅拷贝只是复制结构体的变量本身,而不复制指向的数据。当你对拷贝后的结构体进行修改时,原始结构体也会受到影响,因为它们共享同一内存区域。这通常发生在结构体中有指针成员的情况下。比如,如果你有一个`struct`定义如下:
```c
typedef struct {
int *address;
} MyStruct;
MyStruct from = {&value}; // 原始结构体,地址指向value
MyStruct to = from; // 浅拷贝,地址也指向value
```
在这个例子中,`to.address`实际上是`from.address`的别名,所以修改`to.address`会改变`from.address`指向的值。
**深拷贝**:
深拷贝则会对整个结构体以及其中所有成员(包括指针)进行完整的副本操作。这意味着每个结构体都有独立的内存空间,即使有指针,指向的也是不同的数据。实现深拷贝通常需要额外的代码来复制指向的数据。例如,对于上述的`MyStruct`,可以创建一个新的`int`并复制`from.address`指向的值:
```c
void deep_copy(MyStruct *to, const MyStruct *from) {
*to.address = malloc(sizeof(int)); // 分配新空间
**to.address = **from.address; // 复制值
}
MyStruct to = {NULL};
deep_copy(&to, &from); // 深拷贝
```
通过这种方式,即使`to`和`from`有相同的指针成员,修改`to.address`也不会影响`from.address`。
阅读全文