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一样?
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语言如何深拷贝结构体?的主要内容,如果未能解决你的问题,请参考以下文章