//
// 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
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 在js中,我们经常复制一个对象,复制数据,那么就会有人问了,怎么复制? JS中对象分为基本类型和复合(引用)类型,...
- 注:本系类笔记采用的是Python3.5X版本,编程环境为Windows64位下的Anaconda所有代码部分均为...
- 第一个问题:什么是浅拷贝和深拷贝?浅拷贝浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。如:...