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

2016-07-04  本文已影响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;
}

上一篇下一篇

猜你喜欢

热点阅读