结构体的浅copy和深copy

来源:互联网 发布:怎么退出windows微信 编辑:程序博客网 时间:2024/05/14 16:24

<一>浅复制
关于结构体的浅copy和深copy问题,下面先看一个示例
定义一个Teacher类型结构体, 然后定义变量t1,t2, 对t1进行初始化,然后通过copyStruct函数将t1赋值到t2
代码如下:

#include "stdafx.h"#include<stdlib.h>#include<stdio.h>#include<string.h>#define _CRT_SECURE_NO_WARNINGS//定义结构体Teachertypedef struct Teacher{    char* name;    int age;}Teacher;//copy Teacher函数int copyStruct(Teacher* to, Teacher* from){    int retCode  = 0;    if(to == NULL || from == NULL){        retCode = -1;        return retCode;    }    *to = *from;    return retCode;}int main(){    //1,声明t1 并且对t1进行初始化    Teacher t1 ;    Teacher t2;    t1.age = 88;    char* name = (char*) malloc(sizeof(char)* 64);    t1.name = name;    strcpy(t1.name,"name88");    //2,t1copy到t2    copyStruct(&t2,&t1);    //3,释放    if(t1.name != NULL){        free(t1.name);        t1.name = NULL;    }    if(t2.name != NULL){        free(t2.name);        t2.name = NULL;    }    return 0;}

上面的代码运行到语句

if(t2.name != NULL){        free(t2.name);        t2.name = NULL;    }

的时候将会抛出错误. 这是一个经典的结构体深复制和浅复制的问题

上面的错误原因在于通过copyStruct函数的结构体copy属于浅复制.
在结构体中, 如果存在有指针变量, 浅复制仅仅复制指针的值,也就是指针的地址, 而指针指向的内容不进行复制. 所以t1.name和t2.name的值一样(浅赋值,复制指针的值), 这样他们指向同一块内存空间.
当对t1.name进行free后, 他们共同指向的内存空间被释放, 那么接下来在对t2.name进行释放的时候错误被抛出,也就是同一块内存被释放两次. 要避免上面的错误,我们需要使用深复制,不光复制内存地址,也把内存地址指向的内容复制一份

<二>深复制
所谓深复制,就是不但复制指针的值,而且指针指向的内容也复制一份
深复制代码如下:

#include "stdafx.h"#include<stdlib.h>#include<stdio.h>#include<string.h>//定义结构体Teachertypedef struct Teacher{    char* name;    int age;}Teacher;//copy Teacher函数int copyStruct(Teacher* to, Teacher* from){    int retCode  = 0;    if(to == NULL || from == NULL){        retCode = -1;        return retCode;    }    //下面的代码体现深复制操作    char *name = (char*) malloc(sizeof(char)*64);    to->name = name;    strcpy(to->name,from->name);    (*to).age = (*from).age;    return retCode;}//打印Teacher 结构体int printStruct(Teacher * t){    int retCode  = 0;    if(t== NULL){        retCode = -1;        return retCode;    }    printf("name : %s,  age: %d\n",t->name, t->age);    return retCode;}int main(){    //1,声明t1 并且对t1进行初始化    Teacher t1 ;    Teacher t2;    t1.age = 88;    char* name = (char*) malloc(sizeof(char)* 64);    t1.name = name;    strcpy(t1.name,"name88");    //2,t1copy到t2    copyStruct(&t2,&t1);    //3,打印    printf("打印t1\n");    printStruct(&t1);    printf("打印t2\n");    printStruct(&t2);    //4,释放    if(t1.name != NULL){        free(t1.name);        t1.name = NULL;    }    if(t2.name != NULL){        free(t2.name);        t2.name = NULL;    }    return 0;}
0 0
原创粉丝点击