【C语言提高41】结构体的浅copy和深copy

来源:互联网 发布:网络电话机怎么安装 编辑:程序博客网 时间:2024/04/29 05:35

编译器的=操作  只会把指针变量值 从from拷贝到to    但不会把指针变量所指的内存空间的拷贝过去    //浅拷贝 

void copyTeacher(Teacher*to,Teacher*from){//*to=*from;memcpy(to,from,sizeof(Teacher));}

浅考本出现在结构体中套一个一级指针或者是二级指针

如果想执行深copy  应该显式的分配内存:

void copyTeacher(Teacher*to,Teacher*from){//*to=*from;memcpy(to,from,sizeof(Teacher));//如果想执行深copy  应该显示的分配内存to->pname2=(char*)malloc(100);strcpy(to->pname2, from->pname2);}


完整代码:

#include<stdlib.h>#include<stdio.h>#include<string.h>#include<ctype.h>typedef struct  Teacher{char name[64];int age;char*pname2;}Teacher;//如果想执行深copy  应该显示的分配内存void copyTeacher(Teacher*to,Teacher*from){//*to=*from;memcpy(to,from,sizeof(Teacher));//如果想执行深copy  应该显示的分配内存to->pname2=(char*)malloc(100);strcpy(to->pname2, from->pname2);}void main61(){Teacher t1;Teacher t2;strcpy(t1.name, "name1");//t1.pname2 是个指针 给指针直接赋值常量值是不可取的  所以必须先明确指针的指向  //给指针所指向的空间赋值  而不是给指针赋值t1.pname2 = (char*)malloc(100);strcpy(t1.pname2, "ssss");//t1 copy t2copyTeacher(&t2, &t1);//释放内存if (t1.pname2 != NULL){free(t1.pname2);t1.pname2 = NULL;}if (t2.pname2 != NULL)//如果是浅拷贝的话 这个地方是会断掉的 因为指针所指向的内存空间已经被上面释放</span></strong><span style="color:#cc6600;">{free(t2.pname2);t2.pname2 = NULL;}printf("hehehe\n");system("pause");return;}

函数说明:

void *memcpy(void *dest, const void *src, size_t n);
//从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中


0 0