C语言如何深拷贝结构体?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言如何深拷贝结构体?相关的知识,希望对你有一定的参考价值。

例如
~~~~~~
struct a

char str[10];
;
~~~~~~
现在令
~~~~~~
struct a a1;
a1.str = "12456789";
struct a2 = a1;
a1.str = "111111111";
~~~~~~
最后a2.str是"111111111"还是"123456789"?
我记得字符串标识符表示的是首个字符的地址,a1.str与a2.str应该指向同一个地址。

但如果是前者,那怎么做到使a2.str使用不同于a1.str的内存,且a1,str的内容也和a2,str一样?

结构体并非一个赋值号就能copy的,需要手动设计自己将其中的每个基础类型进行复制:
struct a a1,a2;
strcpy(a1.str,"123456789"); strcpy(a2.str,a1.str); strcpy(a1.str,"111111111");
在中间那句执行时,a1.str的内容是"123456789",因此赋值给a2.str的也是这个字符串
赋值完成后再改变a1时,a2与此无关了,会保持最后一次操作赋值的结果。
参考技术A 另一个结构体名等于要复制的结构体名 参考技术B

其实a2.str是”123456789”。

虽然字符串标示符表示的是首个字符的地址,也即字符串常数的默认类型是const char*,但注意struct a里面的变量str的类型并不是char*,而是char[10],在内存中表示是10个连续字节,把”123456789”或是”111111111”赋值给str时其实已经经过了一次(某种意义上的)类型转换,或者更直接一点把常量区的字符串常量拷贝到了a1、a2的位置(看不懂也不要紧,反正不是简单的地址赋值而是值赋值),而struct a2=a1也是深拷贝,因为是struct而不是struct a*类型,拷贝的仍是整个结构,因此赋值后a1和a2已经没有关系了,把a1的str换掉后不会对str2产生影响。

如有问题可追问,乐意继续回答。

本回答被提问者采纳
参考技术C

深拷贝_浅拷贝

 

 

深拷贝,拷贝内存的内容,旧结构体发生变化,新结构体也会变化。

浅拷贝,直接地址复制,共享内存,新旧结构体互补影响。

 

 1 #define _CRT_SECURE_NO_WARNINGS
 2 
 3 #include <stdio.h>
 4 #include <stdlib.h>
 5 #include <string.h>
 6 
 7 struct string
 8 {
 9     char *p;
10     int length;
11 };
12 
13 main1()
14 {
15     struct string str1;
16     str1.length = 10;
17     str1.p = (char *)malloc(sizeof(char) * 10);
18     strcpy(str1.p, "hello");
19 
20     printf("str1.p=%s\n", str1.p);
21 
22     struct string str2;//浅拷贝,共享内存
23     str2.length = str1.length;
24     str2.p = str1.p;
25     *(str1.p) = k;
26 
27     printf("str1.p=%s\n", str1.p);
28     printf("str2.p=%s\n", str2.p);
29 
30     system("pause");
31 }
32 
33 main()
34 {
35     struct string str1;
36     str1.length = 10;
37     str1.p = (char *)malloc(sizeof(char) * 10);
38     strcpy(str1.p, "hello");
39 
40     printf("str1.p=%s\n", str1.p);
41 
42     struct string str2;//深拷贝
43     str2.length = str1.length;
44     str2.p = (char *)malloc(sizeof(char) * 10);
45     strcpy(str2.p, str1.p);
46 
47     printf("str1.p=%s\n", str1.p);
48     printf("str2.p=%s\n", str2.p);
49 
50     system("pause");
51 }

 

以上是关于C语言如何深拷贝结构体?的主要内容,如果未能解决你的问题,请参考以下文章

C 语言结构体成员赋值的深拷贝和浅拷贝

C 语言结构体 ( 结构体浅拷贝 )

go 深/浅拷贝结构体对象

深拷贝_浅拷贝

C++入门深拷贝和浅拷贝详解

C++入门深拷贝和浅拷贝详解