結(jié)構(gòu)體的淺拷貝和深拷貝,strcpy,memcpy

//
//  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"

//先定義一個結(jié)構(gòu)體
typedef struct Teacher{
    char name[60];
    int  age;
    char *newName;
}Teacher;

void copyTeacher(Teacher *to,Teacher *from){
    
    
    //*to = *from 內(nèi)存拷貝  兩個等價
    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變量 已經(jīng)分配了sizeof(Teacher)大小的內(nèi)存空間
    strcpy(t2.name, "name1");//內(nèi)存拷貝 將 靜態(tài)存儲的數(shù)組內(nèi)存拷貝到 name指向的內(nèi)存空間
    
    /**
     *  為newName指針動態(tài)分配內(nèi)存
     */
    
//    char* temName = (char *)malloc(100);
//    if (temName == NULL) {
//        t2.newName = temName;
//    }
    /**
        臨時指針 可能會被釋放,個人猜測可能是編譯器的問題
     *  所以這里如果是后面會用到,不建議使用臨時指針.
     */
    t2.newName = (char *)malloc(100);
 
    /**
     *  內(nèi)存拷貝
     */
    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); //已經(jīng)被釋放過的,就不能再釋放了,這里只是拷貝指針,不是深拷貝
    }
    */
    
    Teacher t4;
    deepCopyTeacher(&t4,&t2);
    printf("-t4-->%s\n",t4.name);
    printf("-t4-->%s\n",t4.newName);
    
    /**
     *  釋放內(nèi)存
     */
    if(t2.newName != NULL){
        free(t2.newName);//釋放內(nèi)存 并不代表這個內(nèi)存中的值 瞬間為空.而是說這塊內(nèi)存的權(quán)限分配出去了,別人也可以使用,
//所以使用這塊內(nèi)存的時候,打印出來,可能為空,可能是原有的值,也可能是其他亂碼.
    }
    
    /**
     *  釋放內(nèi)存
     */
    if(t4.newName != NULL){
        free(t4.newName);
    }
    return 0;
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容