zoukankan      html  css  js  c++  java
  • 结构体中的深浅拷贝

    #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;
    }

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

  • 相关阅读:
    python模块
    Django基础
    Python __str__(self)和__unicode__(self)
    Redis基本操作
    测试面试宝典
    h5页面的测试方式
    selenium IDE的使用流程
    如何安装chrome扩展程序--selenium IDE
    Selenium 中 强制等待、显示等待、隐式等待的区别
    Selenium+Python 自动化 之八种元素定位方法
  • 原文地址:https://www.cnblogs.com/yangguang-it/p/6684180.html
Copyright © 2011-2022 走看看