用c解析深拷贝和浅拷贝
首先,由于本人是个c的"老手"了,但一直没明白什么是深拷贝和浅拷贝,所以现在花点时间搞搞搞。我们要明白什么是浅拷贝,才能认清深拷贝,这样也容易区分,更不用去死记硬背,死记硬背的东西永远不是你的,请记住。
浅拷贝:就是把一个对象给另一个对象赋值或者初始化的时候,若对象包含指针成员变量,这时直接赋值会造成浅拷贝现象,因为编译器没有真实赋值。
深拷贝:开辟内存空间,对指针成员重新赋值。
其实,也是共享内存
如图所示:
代码如下:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
/字符串常量
char *str4 = "hello word";
void fun()
{
char *str3 = "hello word";
printf("str2 = %d\n",str3);
}
int main()
{
char *str1 = "hello word";
char *str2 = "hello word";
//这里我打印用的是%d,地址是指向同一个地址。这是浅拷贝
printf("str1 = %d\n",str1);
printf("str2 = %d\n",str2);
printf("str4 = %d\n",str4);
fun();
return 0;
}
输出
int main()
{
char arr[100];
char *brr[3];//指针数组
for(int i = 0;i < 3;i++)//分别给三个指针变量赋值
{
scanf("%s",&arr);
brr[i] = arr;
}
for(int i = 0;i < 3;i++)
{
printf("%s\n",brr[i]);
}
return 0;
}
输出///这时的值全为cccccccc
int main()
{
char arr[100];
char *brr[3];
for(int i = 0;i < 3;i++)
{
scanf("%s",&arr);
//char *str = (char *)malloc(sizeof*100);用sizeof无法确定大小
brr[i] = (char *)malloc((strlen(arr)+1)*sizeof(char));//strlen+1
/*str = arr;
brr[i] = str;*/
strcpy(brr[i],arr);
}
for(int i = 0;i < 3;i++)
{
printf("%s\n",brr[i]);
}
return 0;
}
输出///这时的值分别为三次输入的值
//这是我的总结,其实还没完成,还没free动态内存,会造成内存泄漏