区分前提(结构体中有指针变量)
浅拷贝
#include <stdio.h>
#include <stdlib.h>
struct Foo {
char a;
int b;
double c;
char *p_d;
}foo1, foo2;
void struct_shallow_copy(void)
{
foo2 = foo1; //structure directly assignment
}
int main()
{
char *d = (char *) malloc (4*sizeof(char));
d[0] = 'b'; d[1] = 'c'; d[2] = 'd'; d[3] = '\0';
foo1.a = 'a';
foo1.b = 1;
foo1.c = 3.14;
foo1.p_d = d;
struct_shallow_copy();
printf("%c %d %lf %s\n", foo2.a, foo2.b, foo2.c, foo2.p_d);
printf("%#x %#x\n", foo1.p_d, foo2.p_d);
return 0;
}
结果:foo1与foo2的p_d都指向同一个空间,如果其中一个把其指向的内存释放了,那么另一个就会变成野指针。
深拷贝
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Foo {
char a;
int b;
double c;
char *p_d;
}foo1, foo2;
void struct_deep_copy(void)//不使用结构体整体赋值
{
foo2.a = foo1.a;
foo2.b = foo1.b;
foo2.c = foo1.c;
foo2.p_d = (char *) malloc (4*sizeof(char));
strcpy(foo2.p_d,foo1.p_d); //Deep copy
}
int main()
{
char *d = (char *) malloc (4*sizeof(char));
d[0] = 'b'; d[1] = 'c'; d[2] = 'd'; d[3] = '\0';
foo1.a = 'a';
foo1.b = 1;
foo1.c = 3.14;
foo1.p_d = d;
struct_deep_copy();
printf("%c %d %lf %s\n", foo2.a, foo2.b, foo2.c, foo2.p_d);
printf("%#x %#x\n", foo1.p_d, foo2.p_d);
return 0;
}