//
// 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
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
相关阅读更多精彩内容
- 在js中,我们经常复制一个对象,复制数据,那么就会有人问了,怎么复制? JS中对象分为基本类型和复合(引用)类型,...
- 注:本系类笔记采用的是Python3.5X版本,编程环境为Windows64位下的Anaconda所有代码部分均为...
- 第一个问题:什么是浅拷贝和深拷贝?浅拷贝浅拷贝就是对内存地址的复制,让目标对象指针和源对象指向同一片内存空间。如:...