• 结构体中的深浅拷贝


    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    typedef struct Peo {
        char *name;
        int age;
    }peo;
    
    
    int main(void)
    {
        peo p1;
        p1.name = (char *)malloc(sizeof(char) * 30);
        if (p1.name == NULL)
            return;
        strcpy(p1.name, "lihua");
        p1.age = 13;
    
        peo p2 = p1;
        printf("p1.name:%s p1.age:%d
    p2.name:%s p2.age:%d
    ",
            p1.name, p1.age,p2.name,p2.age);
        if (p1.name != NULL)
        {
            free(p1.name);
            p1.name = NULL;
        }
    /*不能再次释放了,这是浅拷贝,只拷贝了一份指针的副本,而没有新开辟内存空间,故不可再释放*/
        //if (p2.name != NULL)
        //{
        //    free(p2.name);
        //    p2.name = NULL;
        //}
        return 0;
    }

    直接用“=”操作符,是浅拷贝,要实现深拷贝,更改代码如下:

    #define _CRT_SECURE_NO_WARNINGS
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    typedef struct Peo {
        char *name;
        int age;
    }peo;
    //深拷贝需要自己分配内存
    void mycopy(peo *des,peo *soure)
    {
        des->name= (char *)malloc(sizeof(char) * 30);
        strcpy(des->name, soure->name);
        des->age = soure->age;
    }
    int main(void)
    {
        peo p1;
        p1.name = (char *)malloc(sizeof(char) * 30);
        if (p1.name == NULL)
            return;
        strcpy(p1.name, "lihua");
        p1.age = 13;
    
        peo p2;
        mycopy(&p2, &p1);
        printf("p1.name:%s p1.age:%d
    p2.name:%s p2.age:%d
    ",
            p1.name, p1.age,p2.name,p2.age);
        if (p1.name != NULL)
        {
            free(p1.name);
            p1.name = NULL;
        }
        if (p2.name != NULL)
        {
            free(p2.name);
            p2.name = NULL;
        }
    
        return 0;
    }

    这样深拷贝之后,就需要释放两次内存。在以后的业务逻辑中,须根据需要选择使用深拷贝还是浅拷贝,但我们要知道,编译的“=”(赋值)操作符是浅拷贝。

  • 相关阅读:
    设置装订线
    设置页边距
    查看压缩文件的信息
    格式化3
    格式化2
    条件格式化1
    单独设置奇偶页的页眉页脚
    方法重写注意点
    super注意点
    稀疏数组的压缩和还原
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/6684180.html
Copyright © 2020-2023  润新知