我试过谷歌搜索,但只有面向对象的语言出现在搜索结果中。
据我理解,浅复制是复制结构体的特定成员。
比如说一个结构体是
typedef struct node
{
char **ok;
int hi;
int yep;
struct node *next;
}node_t
复制 char** 将是浅复制,
但复制整个链表将是深度复制?
我理解的对吗?谢谢。
我试过谷歌搜索,但只有面向对象的语言出现在搜索结果中。
据我理解,浅复制是复制结构体的特定成员。
比如说一个结构体是
typedef struct node
{
char **ok;
int hi;
int yep;
struct node *next;
}node_t
复制 char** 将是浅复制,
但复制整个链表将是深度复制?
我理解的对吗?谢谢。
typedef struct {
char *name;
int value;
} Node;
Node n1, n2, n3;
char name[] = "This is the name";
n1 = (Node){ name, 1337 };
n2 = n1; // Shallow copy, n2.name points to the same string as n1.name
n3.value = n1.value;
n3.name = strdup(n1.name); // Deep copy - n3.name is identical to n1.name regarding
// its *contents* only, but it's not anymore the same pointer
据我所知,C语言中没有实际的“浅拷贝”或“深拷贝”。
有些答案可能是正确的,但如果你从面向对象编程的角度来看,它们会误导你。
在C语言中,只有一种内置的复制技术,即使用“=”运算符时的数据复制。
C语言将结构体的元数据存储在RAM中,并确保一旦创建了结构体,其大小就不会改变,并且可以从分配的内存的特定部分访问变量。
当您使用“=”运算符时,它仅将存储在结构体中的数据按位复制到另一个结构体中,因为它们具有相同的大小。
在结构体中静态分配的变量和数组具有固定的大小,并完全存储在结构体的分配内存中。动态分配的变量都是指针。指针变量是静态分配内存,相当于无符号长整型。
当您在结构体中有一个指针时,它仅存储地址,即它指向的内存,也就是动态分配的位置,结构体实际上没有任何信息表明指针指向的是内存。操作系统和编译器跟踪动态分配的内存。
例如:
#include <stdio.h>
#include<stdlib.h>
struct Foo
{
int value_1;
int *value_2;
int value_3[3];
}S1,S2;
void print(struct Foo S)
{
printf("%d,%d,%d,%d,%d\n",S.value_1,*(S.value_2),S.value_3[0],S.value_3[1],S.value_3[2]);
}
int main()
{
S1.value_1=43;
S1.value_2=(int*)malloc(sizeof(int));
*(S1.value_2)=55;
S1.value_3[0]=101;
S1.value_3[1]=102;
S1.value_3[2]=103;
printf("S1:");
print(S1);
S2=S1;
printf("S2:");
print(S2);
S1.value_1=4300;
*(S1.value_2)=5500;
S1.value_3[0]=10100;
S1.value_3[1]=10200;
S1.value_3[2]=10300;
printf("\nAfter Altering\n");
printf("S1:");
print(S1);
printf("S2:");
print(S2);
return 0;
}
输出:
S1:43,55,101,102,103
S2:43,55,101,102,103
After Altering
S1:4300,5500,10100,10200,10300
S2:43,5500,101,102,103
简而言之,在C语言中,复制操作有两种行为:
此外,如果您想要创建一个指向结构体变量(非新分配)的指针,只要内存在作用域内,它将像引用一样起作用。无论是使用普通变量还是结构体指针进行的更改都会导致两者反映相同。
int a=20;
Foo S1,*S2;
S2=&S1;
S1.value1=10;
S1.value2=&a;
S1.value3[0]=101;
S1.value3[1]=102;
S1.value3[2]=103;
S2->value1=15;
复制构造函数用于使用先前创建的同一类对象初始化新对象。默认情况下,编译器会编写浅拷贝。当不涉及动态内存分配时,浅拷贝可以正常工作,因为当涉及动态内存分配时,两个对象将指向堆中的同一内存位置,因此我们编写了深拷贝以消除这个问题,使得两个对象在内存中都有自己的属性副本。要阅读完整的示例和解释细节,请参见本文关于浅拷贝和深拷贝构造函数之间的区别的部分。
->
,S2 = *S1
等修复与S1相关的语法)。结果将完全相同。 - Bruno->
、S2 = *S1
等)。结果将完全相同。 - Bruno