美文网首页
结构体的浅拷贝和深拷贝,strcpy,memcpy

结构体的浅拷贝和深拷贝,strcpy,memcpy

作者: 司马捷 | 来源:发表于2016-07-04 11:02 被阅读2614次
    //
    //  main.c
    //  Struct深拷贝和浅拷贝
    //
    //  Created by Eric on 16/7/4.
    //  Copyright © 2016年 Eric. All rights reserved.
    //
    
    #include <stdio.h>
    #include "string.h"
    #include "stdlib.h"
    
    //先定义一个结构体
    typedef struct Teacher{
        char name[60];
        int  age;
        char *newName;
    }Teacher;
    
    void copyTeacher(Teacher *to,Teacher *from){
        
        
        //*to = *from 内存拷贝  两个等价
        memcpy(to,from,sizeof(Teacher));
    }
    void deepCopyTeacher(Teacher *to,Teacher *from){
        *to = *from;
        to->newName = (char *)malloc(100);
        strcpy(to->newName, from->newName);
        
    }
    
    int main(int argc, const char * argv[]) {
        // insert code here...
        printf("Hello, World!\n");
        
        /**
         *  字符串都分配在栈上
         */
        Teacher t1 = {"扆佳梁",10,"eric"};
        printf("--->%s\n",t1.name);
        printf("--->%s\n",t1.newName);
        
        
        Teacher t2; //这表示定义一个Teacher变量 已经分配了sizeof(Teacher)大小的内存空间
        strcpy(t2.name, "name1");//内存拷贝 将 静态存储的数组内存拷贝到 name指向的内存空间
        
        /**
         *  为newName指针动态分配内存
         */
        
    //    char* temName = (char *)malloc(100);
    //    if (temName == NULL) {
    //        t2.newName = temName;
    //    }
        /**
            临时指针 可能会被释放,个人猜测可能是编译器的问题
         *  所以这里如果是后面会用到,不建议使用临时指针.
         */
        t2.newName = (char *)malloc(100);
     
        /**
         *  内存拷贝
         */
        strcpy(t2.newName, "newName1");
    
        printf("--->%s\n",t2.name);
        printf("--->%s\n",t2.newName);
        
    
        
        /**
         *  在定义一个t3
         */
        Teacher t3;
        copyTeacher(&t3,&t2);
        printf("-t3-->%s\n",t3.name);
        printf("-t3-->%s\n",t3.newName);
        
    /*
        if(t3.newName != NULL){
            free(t3.newName); //已经被释放过的,就不能再释放了,这里只是拷贝指针,不是深拷贝
        }
        */
        
        Teacher t4;
        deepCopyTeacher(&t4,&t2);
        printf("-t4-->%s\n",t4.name);
        printf("-t4-->%s\n",t4.newName);
        
        /**
         *  释放内存
         */
        if(t2.newName != NULL){
            free(t2.newName);//释放内存 并不代表这个内存中的值 瞬间为空.而是说这块内存的权限分配出去了,别人也可以使用,
    //所以使用这块内存的时候,打印出来,可能为空,可能是原有的值,也可能是其他乱码.
        }
        
        /**
         *  释放内存
         */
        if(t4.newName != NULL){
            free(t4.newName);
        }
        return 0;
    }
    
    

    相关文章

      网友评论

          本文标题:结构体的浅拷贝和深拷贝,strcpy,memcpy

          本文链接:https://www.haomeiwen.com/subject/akbcjttx.html