C语言基础知识点(十三)结构体的深拷贝与浅拷贝

在C或C++等语言中,结构体(Struct)是一种用户自定义的数据类型,它允许将不同类型的数据项组合成一个单一的类型。对于结构体的拷贝,存在深拷贝(Deep Copy)和浅拷贝(Shallow Copy)两种概念,这两种拷贝方式在处理结构体(特别是包含指针成员的结构体)时尤为重要。

浅拷贝(Shallow Copy)

浅拷贝仅仅复制了结构体中的值,如果结构体中含有指针成员,那么浅拷贝会复制指针的值(即内存地址),而不会复制指针所指向的内存区域。这意味着,原结构体和拷贝后的结构体中的指针成员会指向同一块内存区域。因此,如果通过其中一个结构体的指针成员修改了这块内存区域,那么这种修改对另一个结构体也是可见的。

深拷贝(Deep Copy)

深拷贝不仅复制了结构体中的值,还复制了结构体中所有指针成员所指向的内存区域。这意味着,原结构体和拷贝后的结构体是完全独立的,对其中一个结构体的修改不会影响到另一个。

假设我们有一个结构体,它包含一个整型和一个指向整型的指针

#include <stdio.h>
#include <stdlib.h>

typedef struct
{
    int value;
    int *ptr;
} MyStruct;

// 浅拷贝函数
MyStruct shallowCopy(MyStruct src)
{
    MyStruct dst = src; // 直接赋值,为浅拷贝
    return dst;
}

// 深拷贝函数
MyStruct deepCopy(MyStruct src)
{
    MyStruct dst;
    dst.value = src.value;
    dst.ptr = (int *)malloc(sizeof(int)); // 为新指针分配内存
    if (dst.ptr != NULL)
    {
        *dst.ptr = *src.ptr; // 复制指针指向的内容
    }
    return dst;
}

int main()
{
    MyStruct orig = {10, malloc(sizeof(int))};
    *orig.ptr = 20;

    MyStruct shallow = shallowCopy(orig);
    MyStruct deep = deepCopy(orig);

    *shallow.ptr = 30;                                                             // 修改浅拷贝中的指针指向的值
    printf("Orig value: %d, pointer value: %d\n", orig.value, *orig.ptr);          // 预期输出: 10, 30
    printf("Shallow value: %d, pointer value: %d\n", shallow.value, *shallow.ptr); // 预期输出: 10, 30

    *deep.ptr = 40; // 修改深拷贝中的指针指向的值

    printf("Orig value: %d, pointer value: %d\n", orig.value, *orig.ptr); // 预期输出: 10, 30
    printf("Deep value: %d, pointer value: %d\n", deep.value, *deep.ptr); // 预期输出: 10, 40

    // 清理内存
    free(orig.ptr);
    free(shallow.ptr); // 注意:这里不需要释放,因为shallow.ptr和orig.ptr指向同一块内存
    free(deep.ptr);

    return 0;
}

运行结果为

  • 浅拷贝只复制了结构体的值,如果结构体中包含指针,则指针的值(即内存地址)会被复制,但指针指向的内存区域不会被复制。
  • 深拷贝复制了结构体的值,并且为结构体中所有指针成员所指向的内存区域分配了新的内存,并复制了内容。这样,原结构体和拷贝后的结构体在内存中是独立的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
结构体的拷贝可以分为深拷贝浅拷贝两种方式。 浅拷贝是指将一个结构体的值复制到另一个结构体中,包括结构体成员的基本数据类型和指针地址的复制。当进行浅拷贝时,只是复制了指针的地址,而没有复制指针指向的具体数据。这意味着如果其中一个结构体修改了指针指向的数据,另一个结构体也会受到影响。 深拷贝是指将一个结构体的值复制到另一个结构体中,并且对于指针类型的成员变量,还会将指针指向的数据进行复制。这样,在进行深拷贝后,每个结构体都有自己独立的数据副本,互不影响。 下面是一个示例,演示了浅拷贝深拷贝的区别: ```c #include <stdio.h> #include <string.h> typedef struct { char* name; int age; } Person; void shallowCopy(Person* dest, Person* src) { dest->name = src->name; dest->age = src->age; } void deepCopy(Person* dest, Person* src) { dest->name = malloc(strlen(src->name) + 1); strcpy(dest->name, src->name); dest->age = src->age; } int main() { Person person1; person1.name = "John"; person1.age = 25; Person person2; // 浅拷贝 shallowCopy(&person2, &person1); printf("Shallow copy:\n"); printf("person1 name: %s, age: %d\n", person1.name, person1.age); printf("person2 name: %s, age: %d\n", person2.name, person2.age); // 修改person1的name person1.name = "David"; printf("After modifying person1 name:\n"); printf("person1 name: %s, age: %d\n", person1.name, person1.age); printf("person2 name: %s, age: %d\n", person2.name, person2.age); // person2的name也被修改了 // 深拷贝 deepCopy(&person2, &person1); printf("Deep copy:\n"); printf("person1 name: %s, age: %d\n", person1.name, person1.age); printf("person2 name: %s, age: %d\n", person2.name, person2.age); // 修改person1的name person1.name = "Mike"; printf("After modifying person1 name:\n"); printf("person1 name: %s, age: %d\n", person1.name, person1.age); printf("person2 name: %s, age: %d\n", person2.name,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值