编译器的=操作 只会把指针变量值 从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 t2
copyTeacher(&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所指的内存地址的起始位置中